0

この戦略を使用して、データテーブルの5列目以降のすべての列の値を平均しようとしています

List<double> mylist = new List<double>();
        for (int col = 5; col < GridData.Columns.Count; col++)
        {
            double avg = GridData.AsEnumerable()
                .Where(x => x[GridData.Columns[col]] != DBNull.Value)
             .Average(x => x.Field<double>(GridData.Columns[col]));
            mylist.Add(avg);
        }

this stackoverflow questionで見つけたものから変更されました。

これを実行するたびに、行に「指定されたキャストが無効です」というエラーが表示されます-.Average(x => x.Field<double>(GridData.Columns[col]));

4

2 に答える 2

2

最も簡単な解決策は、DataTable フィールドにある文字列を解析することですが、値を解析できることを確認する必要があります。これをチェックして:

List<double> mylist = new List<double>();
for (int col = 5; col < GridData.Columns.Count; col++)
{
       double avg = GridData.AsEnumerable()
            .Where(x => x[col] != DBNull.Value)
            .Average(x => double.Parse(x[col].ToString()));
                mylist.Add(avg);
}

または使用するとさらに良いTryParse

List<double> mylist = new List<double>();
for (int col = 0; col < GridData.Columns.Count; col++)
{
       double a;
       double avg = GridData.AsEnumerable()
             .Where(x => x[col] != DBNull.Value)
             .Average(x => double.TryParse(x[col].ToString(), out a) ? a:0.0);
                   mylist.Add(avg);
}

3 つ目は、最も安全ですが、解析が冗長になります。

for (int col = 0; col < GridData.Columns.Count; col++)
            {
                double a;
                double avg = GridData.AsEnumerable()
                    .Where(x => x[col] != DBNull.Value && double.TryParse(x[col].ToString(), out a))
                    .Average(x => double.Parse(x[col].ToString()));
                mylist.Add(avg);
            }
于 2013-03-31T21:38:12.000 に答える
1

あなたのコメントに基づいて、エラー:

System.Data.Datarow does not contain a defintion for Field

一般的な拡張メソッドは次のことを示唆していFieldます:

public static T Field<T>(this DataRow row, DataColumn column)

見つかりません。の拡張メソッドでアセンブリを参照しましたDataRowか?

System.Data.DataSetExtensions.dll

そして、おそらくそれに追加する必要がありますusing

using System.Data.DataSetExtensions;
于 2013-03-31T21:09:53.497 に答える