2

8つのフィールドを持つDataTableがあります。最初の7つのフィールドをグループ化し、8番目の最大値を持つ別のDataTableを返したいと思います。すべてのフィールドは文字列であり、8番目は文字列フィールドに格納されている数値です(例:「24」)。

私がこれまでに試したコード:

public DataTable highestVersion(DataTable dt)
        {
            DataTable dtResult=dt.Clone();

            var query=from dtRow in dt.AsEnumerable()
                      group dtRow by new
                      {
                          b_r = dtRow["r"],
                          b_1 = dtRow["b_1"],
                          b_2 = dtRow["b_2"],
                          p_r = dtRow["p_r"],
                          p_1 = dtRow["p_1"],
                          p_2 = dtRow["p_2"],
                          p_f = dtRow["p_f"]
                      }
                          into maxVersion
                          select maxVersion.OrderByDescending(a => a["p_v"]).First();

            foreach (var result in query)
            {
                 dtResult.ImportRow(result);
            }
            return dtResult;
        }

私の期待は、最初の7でグループ化し、を呼び出すことによって各グループ化group dtRow by new{}の最も高い要素のみを取得する必要があることです。しかし、これは実際には何もしないようです。すべての入力行が返されます。p_vOrderByDescending().First()

編集:私はちょうど問題が何であるかを理解しました。の値p_fは互いに異なります。例:

datarow 1
--------
r: "abc"
b_1: "def"
b_2: "ghi"
p_r: "jkl"
p_1: "mno"
p_2: "pqr"
p_f: "stu_this"
p_v: "18"

datarow 2
--------
r: "abc"
b_1: "def"
b_2: "ghi"
p_r: "jkl"
p_1: "mno"
p_2: "pqr"
p_f: "stu_that"
p_v: "24"

この場合、24> 18であるため、DataRow 2のみを返し、stu_that値を取得できるようにします。

4

1 に答える 1

4

コメントへの返信で回答を更新しました:

var res = dt.AsEnumerable()
            .GroupBy(dtRow => new
            {
                b_r = dtRow["r"],
                b_1 = dtRow["b_1"],
                b_2 = dtRow["b_2"],
                p_r = dtRow["p_r"],
                p_1 = dtRow["p_1"],
                p_2 = dtRow["p_2"]
            })
            .Select(g => new
            {
                Group = g,
                Max = g.Max(r => r["p_v"])
            })
            .Select(g => new
            {
                Key = g.Group.Key,
                Max = g.Max,
                Values = g.Group
                          .Where(r => r["p_v"].Equals(g.Max))
                          .Select(r => r["p_f"])
            });

ある程度最適化できると思いますが、もちろん、すべての条件がわかっていれば、少なくともこれでうまくいくはずです。

于 2012-12-18T02:45:25.747 に答える