0

DataTable の各列を平均し、それらの平均をリストに追加しています。平均に 0 の値が含まれないようにするにはどうすればよいですか? 以下のコードを試してみましたが、!=演算子を型のオペランドに適用できないというエラーが表示されobject[]int

for (int col = 5; col < DT2.Columns.Count; col++)
{
    double avg = DT2.AsEnumerable()
                 .Where(x => 
                     x[DT2.Columns[col]] != DBNull.Value || 
                     x[DT2.Rows[col].ItemArray != 0)
                 .Average(x => double.Parse(x[DT2.Columns[col]].ToString()));
    averages.Add(avg);
}

5列目以降のすべての列を平均したいだけなので、col = 5から始めます。平均化される列のデータは double 型です。0 の値を削除しようとしているコードを削除すると、コードが実行されますが、たとえば、最初の列を平均し、列に 10 行あり、そのうちの 3 行に 0 が含まれている場合、すべての行を合計して 10 で割ります。 7で割る必要がある場合

4

2 に答える 2

0

5 の後の列だけが必要な場合は、列をインラインで使用できます。

var columns = DT2.Columns.Cast<DataColumn>().Skip(5);
var rows = DT2.AsEnumerable();

IEnumerable<double> rowAverages =
      rows
        .Select(r =>
            columns
                .Where(c =>
                    r[c] != DBNull.Value &&
                    r[c] is double &&
                    ((double)r[c]) > 0)
                .Select(c =>
                    (double)r[c]))
        .Select(r =>
            r.Any() ? r.Average() : 0);

IEnumerable<double> columnAverages =
      columns
        .Select(c =>
            rows.Where(r =>
                    r[c] != DBNull.Value &&
                    r[c] is double &&
                    ((double)r[c]) > 0)
                .Select(r => (double)r[c]))
        .Select(c => c.Any() ? c.Average() : 0);
于 2013-04-02T13:48:39.767 に答える