select不同的使用LINQ

我有class级的class级名单

public class LinqTest { public int id { get; set; } public string value { get; set; } } 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" }); 

我只需要从列表中select唯一的ID。 即,我的结果列表应该只包含

 [{id=1,value="a"},{ id = 2, value = "c" }] 

我怎么能用linq做到这一点?

编辑

input,

 id value 1 a 1 b 2 c 3 d 3 e 

输出应该是,

 id value 1 a 2 c 3 d 

即,如果有重复的id ,则结果应该仅仅是第一次出现。

 myList.GroupBy(test => test.id) .Select(grp => grp.First()); 

编辑:因为获得这个IEnumerable<>到一个List<>似乎是很多人的一个谜,你可以简单地写:

 var result = myList.GroupBy(test => test.id) .Select(grp => grp.First()) .ToList(); 

但是,对于IEnumerable而不是IList ,通常情况下会更好,因为上面的Linq是懒洋洋地评估的:在迭代枚举之前,它实际上并没有做所有的工作。 当你调用ToList它实际上ToList整个枚举,迫使所有的工作都要完成。 (如果你的枚举无限长,可能需要一点时间。)

这个build议的反面是,每次你枚举这样一个IEnumerable的工作来评估它必须重新做。 所以你需要决定每种情况是否更好地使用IEnumerable进行评估,或者将其实现为ListSetDictionary或者其他types。

使用morelinq你可以使用DistinctBy

 myList.DistinctBy(x => x.id); 

否则,你可以使用一个组:

 myList.GroupBy(x => x.id) .Select(g => g.First()); 

你应该重写EqualsGetHashCode ,在这种情况下比较ID:

 public class LinqTest { public int id { get; set; } public string value { get; set; } public override bool Equals(object obj) { LinqTest obj2 = obj as LinqTest; if (obj2 == null) return false; return id == obj2.id; } public override int GetHashCode() { return id; } } 

现在你可以使用Distinct

 List<LinqTest> uniqueIDs = myList.Distinct().ToList(); 
 myList.GroupBy(i => i.id).Select(group => group.First())