猿问

与兰达不同?

与兰达不同?

是的,所以我有一个可枚举的,并希望从中得到不同的值。

使用System.Linq,当然有一个扩展方法叫做Distinct..在简单的情况下,可以在没有参数的情况下使用它,例如:

var distinctValues = myStringList.Distinct();

好的,但是如果我有一个需要指定相等的对象的枚举,那么唯一可用的重载是:

var distinctValues = myCustomerList.Distinct(someEqualityComparer);

相等比较器参数必须是IEqualityComparer<T>..当然,我可以这样做,但它有点冗长,而且,嗯,是排他性的。

我所期望的是一个过载,它需要一个羔羊,比如Func<T,bool>:

var distinctValues    = myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);

有人知道是否存在这样的扩展,或者某种类似的解决方法?还是我遗漏了什么?

或者,是否有一种方法可以指定IEQuityComper内联(妨碍我)?

更新

我发现Anders Hejlsberg对在MSDN论坛上讨论这个问题。他说:

您将遇到的问题是,当两个对象比较相等时,它们必须具有相同的GetHashCode返回值(否则,DISTION内部使用的哈希表将不能正常工作)。我们使用IEQuityComper,因为它将Eques和GetHashCode的兼容实现打包到一个接口中。

我想这是有道理的.。


哔哔one
浏览 455回答 3
3回答

开满天机

IEnumerable<Customer>&nbsp;filteredList&nbsp;=&nbsp;originalList&nbsp;&nbsp;.GroupBy(customer&nbsp;=>&nbsp;customer.CustomerId) &nbsp;&nbsp;.Select(group&nbsp;=>&nbsp;group.First());

白衣染霜花

在我看来你想DistinctBy从…MoreLINQ..然后你可以写:var&nbsp;distinctValues&nbsp;=&nbsp;myCustomerList.DistinctBy(c&nbsp;=>&nbsp;c.CustomerId);下面是一个缩减版本的DistinctBy(没有无效检查,也没有选择指定自己的钥匙比较者):public&nbsp;static&nbsp;IEnumerable<TSource>&nbsp;DistinctBy<TSource,&nbsp;TKey> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(this&nbsp;IEnumerable<TSource>&nbsp;source,&nbsp;Func<TSource,&nbsp;TKey>&nbsp;keySelector){ &nbsp;&nbsp;&nbsp;&nbsp;HashSet<TKey>&nbsp;knownKeys&nbsp;=&nbsp;new&nbsp;HashSet<TKey>(); &nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(TSource&nbsp;element&nbsp;in&nbsp;source) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(knownKeys.Add(keySelector(element))) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;return&nbsp;element; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}

小怪兽爱吃肉

把事情包扎起来..我想大多数像我一样来这里的人最简单解可能不使用任何库尽最大可能性能.(我认为按方法接受的组在表现上是过分的。)下面是使用质量检验员接口,它也适用于空值。用法:var&nbsp;filtered&nbsp;=&nbsp;taskList.DistinctBy(t&nbsp;=>&nbsp;t.TaskExternalId).ToArray();扩展方法码public&nbsp;static&nbsp;class&nbsp;LinqExtensions{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;IEnumerable<T>&nbsp;DistinctBy<T,&nbsp;TKey>(this&nbsp;IEnumerable<T>&nbsp;items,&nbsp;Func<T,&nbsp;TKey>&nbsp;property) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GeneralPropertyComparer<T,&nbsp;TKey>&nbsp;comparer&nbsp;=&nbsp;new&nbsp;GeneralPropertyComparer<T,TKey>(property); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;items.Distinct(comparer); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;}public&nbsp;class&nbsp;GeneralPropertyComparer<T,TKey>&nbsp;:&nbsp;IEqualityComparer<T>{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Func<T,&nbsp;TKey>&nbsp;expr&nbsp;{&nbsp;get;&nbsp;set;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;GeneralPropertyComparer&nbsp;(Func<T,&nbsp;TKey>&nbsp;expr) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.expr&nbsp;=&nbsp;expr; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;bool&nbsp;Equals(T&nbsp;left,&nbsp;T&nbsp;right) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;leftProp&nbsp;=&nbsp;expr.Invoke(left); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;rightProp&nbsp;=&nbsp;expr.Invoke(right); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(leftProp&nbsp;==&nbsp;null&nbsp;&&&nbsp;rightProp&nbsp;==&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(leftProp&nbsp;==&nbsp;null&nbsp;^&nbsp;rightProp&nbsp;==&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;leftProp.Equals(rightProp); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;GetHashCode(T&nbsp;obj) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;prop&nbsp;=&nbsp;expr.Invoke(obj); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(prop==null)?&nbsp;0:prop.GetHashCode(); &nbsp;&nbsp;&nbsp;&nbsp;}}
随时随地看视频慕课网APP
我要回答