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它可以工作!问题解决了!