如何在 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 表达式 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

List去重

如何在图像中找到明亮区域(以及如何在图像中找到阴影区域)

在QGIS中如何添加天地图的WMTS

如何在表单提交后保留文本(如何在提交后不删除自身?)

如何在异步任务中调用意图?或者如何在 onPostExecute 中开始新的活动?

在 Avkit 中如何使用这三行代码,以及如何将音乐静音”