如何使用Linq获得最高价值

Tx3*_*Tx3 18 c# linq

假设我有以下数据:

Name    Priority
A       3
A       5
B       1
C       1
C       3
C       2
Run Code Online (Sandbox Code Playgroud)

我想获得具有最高优先级的不同名称列表,因此结果如下所示:

Name    Priority
A       5
B       1
C       3
Run Code Online (Sandbox Code Playgroud)

我如何使用Linq来做到这一点?

Luk*_*keH 17

var query = yourData
    .GroupBy(x => x.Name,
             (k, g) => g.Aggregate((a, x) => (x.Priority > a.Priority) ? x : a));

// and a quick test...
foreach (var result in query)
{
    Console.WriteLine(result.Name + " " + result.Priority);
}
Run Code Online (Sandbox Code Playgroud)

  • 不确定你是否知道,但LinqPad非常适合这种快速片段. (2认同)

Enr*_*lio 5

这是另一种方法:

var items = new List<Tuple<string, int>>()
{
    Tuple.Create("A", 3),
    Tuple.Create("A", 5),
    Tuple.Create("B", 1),
    Tuple.Create("C", 1),
    Tuple.Create("C", 3),
    Tuple.Create("C", 2)
};

var results = items.GroupBy(i => i.Item1)
                   .SelectMany(g => g
                       .Where(i => i.Item2 == g.Max(m => m.Item2)))
                   .Distinct();
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢使用C#LINQ语法:

results = (from item in items
           group item by item.Item1 into groupedItems
           let maxPriority = groupedItems.Max(item => item.Item2)
           from element in groupedItems
           where element.Item2 == maxPriority
           select element).Distinct();
Run Code Online (Sandbox Code Playgroud)

  • 有点.你知道[LinqPad](http://www.linqpad.net/)吗?这就是我用来测试这些代码的东西.我将`from item in items`改为`from items.AsQueryable()`,最后添加`results.Dump()`,然后查看下面的"λ"面板.它显示了查询,因为它是从查询表达式语法转换为常规lambda语法.通过观察它来评估复杂性更容易(至少对我而言).如果你想看IL,你可以,但它在C#看起来好多了;) (2认同)