簡體   English   中英

從c#中的數據表中獲取最大值代碼拋出InvalidCastException

[英]Get Maximum value code from a datatable in c# throws InvalidCastException

我有一個類似的數據表

Rank  Year  Value
1     1990  1234556.5676
2     2000  12313.1212 
3     2010  131242.1234

我在以下線程的幫助下編寫了以下代碼: 如何選擇數據表中列的最小值和最大值?

double dMaxValue = 0;
foreach (DataRow dr in dsView.Tables[0].Rows)
{
    double dValue = dr.Field<double>("Value");
    dMaxValue = Math.Max(dMaxValue, dValue);
}

這會引發錯誤“指定的強制轉換無效”。 我在這里缺少什么,以及在找到MAX值后如何獲得年份列的值? 年份需要返回到調用程序。

編輯 - (解決方案):在SLacks的幫助下,我想出了如何完成任務。 首先,我發現我的數據表中的數據是字符串類型,因此將值轉換為double並確定最大值。 然后使用變量來查找相應的年份。

string sYear = string.Empty;
double dMaxValue = double.MinValue;
foreach (DataRow dr in dsView.Tables[0].Rows)
{
    double dValue = Convert.ToDouble(dr.Field<string>("Value"));
    if (dValue > dMaxValue)
    {
        sYear = dr["Year"].ToString();
    }
    dMaxValue = Math.Max(dMaxValue, dValue);                            
}
return sYear;

您的Value列可能是decimal ,也可能是float

你不能直接從盒裝float投射到double ,所以你需要額外的施法。

最好使用數據集中字段的實際類型,或將該類型更改為Double

你怎么得到這一年?

您可以對數據視圖進行排序:

           http://msdn.microsoft.com/en-us/library/system.data.dataview.sort.aspx

然后從排序視圖中提取年份。

嘗試這樣的事情(使用System.Linq和Extensions,注意轉換的let變量):

double maxVal = 0; // supposing all your values are > 0
var maxRow = (from row in dsView.Tables[0].AsEnumerable() 
   let Val = Convert.ToDouble(row.Field<string>("Value"))
   where Val > maxVal
   select new {maxVal = Val, Year = row.Field<int>("Year")}).Last();

return maxRow.Year;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM