使用其他条件进行不同的Linq过滤

时间:2011-06-30 08:14:38

标签: c# linq distinct

我有一个列表,其中包含重复的项目值(按ID),但具有不同(或可能相同)的优先级。应从列表中删除具有相同或较低优先级的重复项目。

例如:

var items = new {
   new { Id=2, Priority=3 },
   new { Id=4, Priority=4 },
   new { Id=1, Priority=4 },
   new { Id=2, Priority=5 },
   new { Id=4, Priority=4 }
};

RemoveDuplicates(items);

// items should now contain distinct values,
// with highest possible priority
var items = new {
   new { Id=1, Priority=4 }, // this one was unique
   new { Id=2, Priority=5 }, // this one was duplicate with higher priority
   new { Id=4, Priority=4 }, // this one was duplicate with same priority
};

是否可以使用LINQ执行此操作?我知道我可以按ID对列表进行排序,然后检查相邻的项目,但只想检查是否可行。

(更新:输入值不一定按ID分组)

2 个答案:

答案 0 :(得分:4)

        var items = new[] {
           new { Id=2, Priority=3 },
           new { Id=2, Priority=5 },
           new { Id=1, Priority=4 },
           new { Id=4, Priority=4 },
           new { Id=4, Priority=4 }
        };

        var deduped = items
            .GroupBy(item => item.Id)
            .Select(group => group.OrderByDescending(item => item.Priority).First())
            .OrderBy(item => item.Id);

答案 1 :(得分:1)

Distinct Extension Method返回序列中的不同元素。您可以提供IEqualityComparer< TSource>确定两个元素何时相等。但是,该方法不允许您选择使用两个相等元素中的哪一个。

您可以使用GroupBy Extension Method按ID对列表进行分组,然后从每个组中选择优先级最高的元素:

var query = items.GroupBy(item => item.Id)
                 .Select(g => g.MaxBy(item => item.Priority))
                 .OrderBy(item => item.Id);

使用MoreLINQ中的MaxBy。