相关疑难解决方法(0)

Distinct()与lambda?

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

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

var distinctValues = myStringList.Distinct();
Run Code Online (Sandbox Code Playgroud)

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

var distinctValues = myCustomerList.Distinct(someEqualityComparer);
Run Code Online (Sandbox Code Playgroud)

equality comparer参数必须是.的实例IEqualityComparer<T>.当然,我可以做到这一点,但它有点冗长,而且很有说服力.

我所期望的是一个需要lambda的重载,比如Func <T,T,bool>:

var distinctValues
    = myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);
Run Code Online (Sandbox Code Playgroud)

任何人都知道是否存在某些此类扩展或某些等效的解决方法?或者我错过了什么?

或者,有没有一种方法可以指定IEqualityComparer内联(embarass me)?

更新

我找到了Anders Hejlsberg对MSDN论坛中关于这个主题的帖子的回复.他说:

您将遇到的问题是,当两个对象比较相等时,它们必须具有相同的GetHashCode返回值(否则Distinct内部使用的哈希表将无法正常运行).我们使用IEqualityComparer,因为它将Equals和GetHashCode的兼容实现打包到一个接口中.

我认为那是有道理的..

c# lambda extension-methods c#-3.0

714
推荐指数
8
解决办法
37万
查看次数

与LINQ-C#不同

我有下面的列表和查询表达式来获取不同的列表。

 List<LinqTest> myList = new List<LinqTest>();
 myList.Add(new LinqTest() { id = 1, value = "a" });
 myList.Add(new LinqTest() { id = 1, value = "b" });
 myList.Add(new LinqTest() { id = 2, value = "c" });
 myList.Select(m => new { m.id}).Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)

我已经提到了下面SO链接链接的代码。即使在使用distinct()之后,我也获得了3个具有重复值的记录。可能是什么原因?

c# linq

2
推荐指数
2
解决办法
3277
查看次数

标签 统计

c# ×2

c#-3.0 ×1

extension-methods ×1

lambda ×1

linq ×1