我有以下列表和查询表达式来获取不同的列表。
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();
我已在下面提到了SO链接link以获取代码。即使在使用distinct()之后我也会获得具有重复值的3条记录。 可能是什么原因?
答案 0 :(得分:4)
您在调试时看到的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();
答案 1 :(得分:2)
在您的情况下,Distinct()
方法使用anonimous类型对象的默认相等比较器。因此,结果不是预期的。如果您想获得唯一的id
值,请使用
List<int> ListOfIDs = myList.Select(m => m.id).Distinct().ToList();
如果您想获得自定义类型的不同对象,则需要实现IEquatable通用接口,并为该类型提供自己的GetHashCode
和Equals
方法。有关详细信息,请参阅MSDN。
答案 2 :(得分:2)
您没有将不同的列表存储到任何地方。更改最后一行,将不同的值分配给新变量。
var distinctList = myList.Select(m => new { m.id}).Distinct().ToList();
答案 3 :(得分:1)
将您的选择更改为.Select(m => m.id)
,您正在创建id为其属性的新对象,然后在获得distinct之后,比较对象时不会提供您需要的确切不同对象。你需要具体,如果你需要通过对象的属性来区分,那么使用GROUP BY或MoreLinq,DistinctBy方法。检查以下问题的答案
答案 4 :(得分:0)
使用GroupBy,
var result = myList
.GroupBy(p => p.id)
.Select(g => g.First())
.ToList();
答案 5 :(得分:0)
以下是执行此操作的示例(请注意Equals
和GetHashCode
方法):
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
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" });
var distinct = myList.Distinct().ToList();
}
class LinqTest
{
public override bool Equals(object obj)
{
var that = obj as LinqTest;
return that == null ? false : Id == that.Id;
}
public override int GetHashCode()
{
return Id;
}
public int Id { get; set; }
public string Value { get; set; }
}
}
}