与LINQ-C#不同

use*_*872 2 c# linq

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

 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个具有重复值的记录。可能是什么原因?

小智 7

您在调试时看到的3条记录是您现有的列表。我认为您错过的只是一项任务。

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" });
// not sure why new {m.id} was used in this context
List<int> distinctList = myList.Select(m => m.id).Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)


Ale*_*der 5

在您的情况下,该Distinct()方法使用匿名类型对象的默认相等比较器。因此,结果是预期之外的。如果你想获得独特的id价值使用

List<int> ListOfIDs = myList.Select(m => m.id).Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)

如果您想获取自定义类型的不同对象,那么您需要实现 IEquatable通用接口并为该类型提供您自己的GetHashCode和方法。Equals有关详细信息,请参阅MSDN