如何在Enumerable.Distinct()中使用lambda表达式

时间:2014-04-02 13:48:08

标签: c# linq lambda

我有一个可以为其指定相等性的多个对象。

var values = list.Distinct();

有没有办法在Enumerable.Distinct()中使用lambda表达式或某些等效的解决方法?

var values = list.Distinct((value1, value2) => value1.Id == value2.Id);

2 个答案:

答案 0 :(得分:2)

不,你不能。你可以像@Hogan在他的回答中所说的那样(https://stackoverflow.com/a/22815177/806975

此外,如果您想要为特定字段添加不同内容,则可以在Select之前使用Distinct

list.Select(x => x.Id).Distinct();

但是,这将仅返回选定的值(Id)。

根据问题referred by @Patrick in his comment aboveDistinct() 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;

答案 1 :(得分:2)

您可以但需要创建一个实现IEqualityComparer的类。然后使用Enumerable.Distinct Method (IEnumerable, IEqualityComparer)