如何在 Enumerable.Distinct() 中使用 lambda 表达式 [重复]
Posted
技术标签:
【中文标题】如何在 Enumerable.Distinct() 中使用 lambda 表达式 [重复]【英文标题】:How to use a lambda expression in Enumerable.Distinct() [duplicate] 【发布时间】:2014-04-02 13:48:08 【问题描述】:我有一个可枚举的对象,我需要为其指定相等性。
var values = list.Distinct();
有没有办法在 Enumerable.Distinct() 中使用 lambda 表达式或一些等效的解决方法?
var values = list.Distinct((value1, value2) => value1.Id == value2.Id);
【问题讨论】:
value1 和 value2 哪来的? 这有帮助吗:***.com/questions/1300088/distinct-with-lambda?rq=1 啊,阅读那个问题,这些是要比较以找到不同的值。 你必须有一个IEqualityComparer
类才能Distinct
元素。
@Patrick 它有效!问题解决了!
【参考方案1】:
您可以,但您需要创建一个实现 IEqualityComparer 的类。然后你使用Enumerable.Distinct Method (IEnumerable, IEqualityComparer)
【讨论】:
【参考方案2】:不,你不能。你可以,就像@Hogan 在他的回答中所说的那样 (https://***.com/a/22815177/806975)
此外,如果您想对特定字段进行区分,您可以在 Distinct
之前使用 Select
。
list.Select(x => x.Id).Distinct();
但是,这将只返回选定的值 (Id
)。
基于问题referred by @Patrick in his comment above(Distinct() with lambda?),并尝试添加一些东西,你可以做一个扩展方法来做你想做的事:
namespace MyProject.MyLinqExtensions
public static class MyLinqExtensions
public static System.Collections.Generic.IEnumerable<TSource> DistinctBy<TSource, TKey>(this System.Collections.Generic.IEnumerable<TSource> list, System.Func<TSource, TKey> expr)
return list.GroupBy(expr).Select(x => x.First());
那么,你可以这样使用它:
list.DistinctBy(x => x.Id)
只要记住在你想使用它的类中导入命名空间:using MyProject.MyLinqExtensions;
【讨论】:
以上是关于如何在 Enumerable.Distinct() 中使用 lambda 表达式 [重复]的主要内容,如果未能解决你的问题,请参考以下文章