下面我有一個方法,我從互聯網上搜索來計算C#中Excel的百分比函數。我修改了一下,以適應我的程序,但沒有改變主要邏輯。參數接受錯誤的類型,仍然運行良好 - 爲什麼?
該程序編譯並運行良好沒有任何錯誤(我知道)。然而進一步檢查我的代碼,在我的主,我請使用
double result = percentRank(array, x);
其中
x是一個int
陣列是列表中的功能(INT)
它是一種不同類型的比percentRank方法指定要採取的,但它仍然運行良好。我的問題是爲什麼?
private static double percentRank(List<int> array, double x)
{
// Calculate the PERCENTRANK(array, x)
//If X matches one of the values in the array, this function is
//equivalent to the Excel formula =(RANK(x)-1)/(N-1) where N is the number of data points.
//If X does not match one of the values, then the PERCENTRANK function interpolates.
// http://www.pcreview.co.uk/forums/algorithm-computing-excel-percentrank-t946312.html
array.Sort();
double result = 0;
bool foundX = false;
for (int index = 0; index < array.Count; index++)
{
if (array[index] == x)
{
result = ((double)index)/((double)array.Count - 1);
foundX = true;
break;
}
}
// calculate value using linear interpolation
if (foundX == false)
{
double x1, x2, y1, y2;
x1 = x2 = x;
for (int i = 0; i < array.Count - 1; i++)
{
if (array[i] < x && x < array[i + 1])
{
x1 = array[i];
x2 = array[i + 1];
foundX = true;
break;
}
}
if (foundX == true)
{
y1 = percentRank(array, x1);
y2 = percentRank(array, x2);
result = (((x2 - x) * y1 + (x - x1) * y2))/(x2 - x1);
}
else
{
// use the smallest or largest value in the set which ever is closer to valueX
if (array[0] > x)
{
result = 0;
}
else
{
result = 1;
}
}
}
return result;
}
編輯:好的答案是隱式類型轉換。我可以禁用它嗎?我不喜歡它,因爲它可能會產生一些我不知道的錯誤。
我真的不明白這個問題。雖然你的變量被稱爲「數組」,但它確實是一個列表,所以函數開始被稱爲正確的類型。這看起來很不錯,但我強烈建議你將你的參數名稱改爲更好的東西(比如cellValueList,這樣你就知道數據來自哪裏)。 –
@BenjaminDangerJohnson他問爲什麼他可以傳遞一個'Int32'到一個定義爲'Double'(「x」,而不是「array」)的參數 –
是不是要重構這個方法? – nan