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
进行评估,或者将其实现为List
, Set
, Dictionary
或者其他types。
使用morelinq你可以使用DistinctBy
:
myList.DistinctBy(x => x.id);
否则,你可以使用一个组:
myList.GroupBy(x => x.id) .Select(g => g.First());
你应该重写Equals
和GetHashCode
,在这种情况下比较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())