C# LINQ/DataTable按多个条件分组并获取最大值

C# LINQ/DataTable按多个条件分组并获取最大值,c#,linq,datatable,aggregate-functions,C#,Linq,Datatable,Aggregate Functions,我有一个包含8个字段的数据表。我想返回另一个DataTable,它将前7个字段分组,最大值为第8个字段。所有字段都是字符串,第8个是存储在字符串字段中的数字,例如“24” 到目前为止我已经尝试过的代码: public DataTable highestVersion(DataTable dt) { DataTable dtResult=dt.Clone(); var query=from dtRow in dt.AsEnumera

我有一个包含8个字段的数据表。我想返回另一个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;
        }
我的期望是,
groupdtrowbynew{}
应该按前7个元素分组,通过调用
OrderByDescending().first()
只获得每个分组的最高元素
p\v
。但这似乎没有什么实际作用;将返回所有输入行

编辑:我刚刚意识到问题是什么。
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"

在这种情况下,我只想返回数据行2,因为24>18,并且能够检索到值为的
stu。\

更新了答案以回应评论:

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"])
            });

我想它可以在某种程度上得到优化,但如果现在知道所有的条件,至少这应该可以完成工作。

更新了回复评论的答案:

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"])
            });

我想它可以在某种程度上得到优化,但如果现在所有条件都已知的话,至少这应该能起到作用。

只是澄清一下,你只需要r、b_1、b_2、p_r、p_1、p_2和p_f的最大值,你想用它来排序行?西格尔,为什么你认为它不起作用?是的!澄清一下,你只需要r,b_1,b_2,p_r,p_1,p_2和p_f的最大值,你想用它来排序行?西格尔,为什么你认为它不起作用?是的!我的原始帖子中没有包含足够的信息。我在编辑中添加了必要的信息。@sigil除了
p\u f
之外,它不是也应该按所有字段分组吗?我仍然坚持你的代码可以完成这项工作……只要从
group by
子句中删除
p\u f
。@sigil,你会如何反映情况,当几行有相等的p_v
和不同的p_f?@konstantin是的,但我不想按
p_f
排序,只要
p_v
。我想从
GroupBy
中排除
p\u f
,但我希望能够检索它的值。如果有多个
p\u f
具有相同的最大值
p\u v
,我将采用所有这些
p\u f
。我意识到一开始我没有给出一个完整的问题,我应该把它作为一个新问题发布吗?我在我的原始帖子中没有包含足够的信息。我在编辑中添加了必要的信息。@sigil除了
p\u f
之外,它不是也应该按所有字段分组吗?我仍然坚持你的代码可以完成这项工作……只要从
group by
子句中删除
p\u f
。@sigil,你会如何反映情况,当几行有相等的p_v和不同的p_f?@konstantin是的,但我不想按
p_f
排序,只要
p_v
。我想从
GroupBy
中排除
p\u f
,但我希望能够检索它的值。如果有多个
p\u f
具有相同的最大值
p\u v
,我将采用所有这些
p\u f
。我意识到一开始我没有给出一个完整的问题,我应该把它作为一个新问题发布吗?