基于特性值的LINQ不同选择

基于特性值的LINQ不同选择,linq,generics,Linq,Generics,我有一个国家的通用列表,里面完全是国家实例 List <Country> mylist 列出我的列表 此列表具有不同的国家/地区实例,但某些国家/地区的属性“名称”具有相同的值 我怎样才能对国家“名称”的属性进行区分,从而只得到名称不同的国家 谢谢 问候 Jose.您可以使用它的方法: (当然,你不必全部采用MoreLINQ——你可以将一个方法与ThrowIfNull扩展方法一起复制到你的代码中,并适当地保留许可证文本。)Jon建议采用MoreLINQ,这显然很好,但也许你想避免

我有一个国家的通用列表,里面完全是国家实例

List <Country> mylist
列出我的列表
此列表具有不同的国家/地区实例,但某些国家/地区的属性“名称”具有相同的值

我怎样才能对国家“名称”的属性进行区分,从而只得到名称不同的国家

谢谢

问候

Jose.

您可以使用它的方法:


(当然,你不必全部采用MoreLINQ——你可以将一个方法与
ThrowIfNull
扩展方法一起复制到你的代码中,并适当地保留许可证文本。)

Jon建议采用MoreLINQ,这显然很好,但也许你想避免另一种依赖。在这种情况下,您可以与自己的
IEqualtyComparer
一起使用:

var distinctccountries=myList.Distinct(新的EqualityComparerForCountryByName());
//质量比较员
类EqualityComparerForCountryByName:IEqualityComparer{
公共布尔等于(x国、y国){
如果(Object.ReferenceEquals(x,y)){return true;}
如果(x==null | | y==null){return false;}
返回x.Name==y.Name;
}
公共整数GetHashCode(国家/地区obj){
如果(obj==null){返回0;}
返回obj.Name.GetHashCode();
}
}

你知道Linq有
独特的
,对吗?:)@bzlm:如果不写一个自定义的相等比较器,那就不能满足OP的要求。@jon,不做任何事情,什么也做不了。:)看起来真不错,可惜我不能给这个项目添加东西。它是封闭的。谢谢。@Jose3d:从堆栈溢出的答案中获取代码与获取具有清晰且相当轻松的许可证的代码有什么显著的不同?您可以在封闭源代码产品中使用开放源代码软件(取决于许可证)-您只需要注意许可证的属性。是的,这就是我搜索的内容。我不能给这个项目添加任何内容。谢谢你提供的有用信息。希望它需要一个
比较
@Marc:它需要计算哈希代码的能力(
Distinct
基本上是在列表中运行时构建一个哈希表,显然使用
GetHashCode
,它需要
等于
来解决冲突)。@Jason,我理解。不要试图粉碎我的梦想=(@Marc:Well:
class EqualityComparerFromComparison:IEqualityComparer{public EqualityComparerFromComparison(Comparison comparer,Func getHashCode){this.comparer=comparer;this.getHashCode=getHashCode;}私有只读比较比较器;私有只读函数getHashCode;公有布尔等于(tx,Ty){返回this.comparer(x,y)==0;}public int GetHashCode(T obj){返回这个。GetHashCode(obj);}}
。您仍然需要指定
GetHashCode
。您可以使用普通的(
obj=>0
),但随后所有内容都会发生冲突。我内联键入了这个,很抱歉出错。
var distinctCountries = allCountries.DistinctBy(c => c.Name);
var distinctCountries = myList.Distinct(new EqualityComparerForCountryByName());
//IEqualityComparer
class EqualityComparerForCountryByName : IEqualityComparer<Country> {
     public bool Equals(Country x, Country y) {
         if(Object.ReferenceEquals(x, y)) { return true; } 
         if(x == null || y == null) { return false; }
         return x.Name == y.Name;
     }

     public int GetHashCode(Country obj) {
         if(obj == null) { return 0; }
         return obj.Name.GetHashCode();
     }
}