LINQ / DataTable组按多个条件获得最大值

时间:2012-12-18 02:34:19

标签: c# linq datatable aggregate-functions

我有一个包含8个字段的DataTable。我想返回另一个DataTable,它将前7个字段分组,最大值为8。所有字段都是字符串,第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;
        }

我的期望是group dtRow by new{}应按前7分组,并通过调用p_v获得每个分组的最高元素OrderByDescending().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"

在这种情况下,我希望只返回DataRow 2,因为24> 18,并且能够检索stu_that值。

1 个答案:

答案 0 :(得分: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"])
            });

我想它可以在某种程度上进行优化,但至少这应该可以胜任,如果所有条件现在都已知,当然。