Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Enumerable.Distinct()中使用lambda表达式_C#_Linq_Lambda - Fatal编程技术网

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

C# 如何在Enumerable.Distinct()中使用lambda表达式,c#,linq,lambda,C#,Linq,Lambda,我有一个可枚举的对象,需要为其指定相等性 var values = list.Distinct(); 有没有一种方法可以在Enumerable.Distinct中使用lambda表达式,或者使用一些等效的解决方法 var values = list.Distinct((value1, value2) => value1.Id == value2.Id); 不,你不能。你可以,就像霍根在回答中说的那样 此外,如果要对特定字段进行Distinct,可以在Distinct之前使用Select

我有一个可枚举的对象,需要为其指定相等性

var values = list.Distinct();
有没有一种方法可以在Enumerable.Distinct中使用lambda表达式,或者使用一些等效的解决方法

var values = list.Distinct((value1, value2) => value1.Id == value2.Id);
不,你不能。你可以,就像霍根在回答中说的那样

此外,如果要对特定字段进行Distinct,可以在Distinct之前使用Select

list.Select(x => x.Id).Distinct();
但是,这将仅返回选定的值Id

基于这个问题,并尝试添加一些内容,您可以使用扩展方法来实现您想要做的事情:

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());
        }
    }
}
只需记住在要使用名称空间的类中导入名称空间:使用MyProject.MyLinqExtensions

不,你不能。你可以,就像霍根在回答中说的那样

此外,如果要对特定字段进行Distinct,可以在Distinct之前使用Select

list.Select(x => x.Id).Distinct();
但是,这将仅返回选定的值Id

基于这个问题,并尝试添加一些内容,您可以使用扩展方法来实现您想要做的事情:

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

只需记住在要使用名称空间的类中导入名称空间:使用MyProject.MyLinqExtensions

可以,但需要创建一个实现IEqualityComparer的类。然后使用

可以,但需要创建一个实现IEqualityComparer的类。然后使用

value1和value2从何而来?这是否有帮助:啊,阅读这个问题,这些是要比较以找到不同元素的值。必须有一个IEqualityComparer类才能区分元素。@Patrick它可以工作!问题解决了!value1和value2从何而来?这是否有帮助:啊,阅读这个问题,这些是要比较以找到不同元素的值。必须有一个IEqualityComparer类才能区分元素。@Patrick它可以工作!问题解决了!