首页 > 解决方案 > Linq distinct 和 max:如何去除重复项

问题描述

我有以下列表:

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

我有以下 linq:

var 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();

我得到这个:

Name    Priority
A       5
B       1
C       3
C       3

我只想区分如下:

Name    Priority
A       5
B       1
C       3

有谁知道如何修改linq来做到这一点?先谢谢你了。

注意:我知道 Distinct 具有允许您传递 IComparer 的重载。但是,如果可以在 linq 语句本身上更简单地完成,我想避免这种情况。我也没有坚持使用 Distinct 语句。

标签: c#linq

解决方案


从根本上说,您尝试执行的操作是从具有特定选择器函数最大值的序列中获取项目。因此,只需编写该函数(或使用其他人编写的函数)即可。请注意,在您的查询中,您将多次迭代序列以完成此操作,并且您可以做得更好。您只需要一次通过即可实现该操作。

现在您所做的只是对分组项目执行单个操作,您的查询变得非常简单:

var query = items.GroupBy(item => item.Item1)
    .Select(group => group.MaxBy(item => item.Item2));

推荐阅读