这个问题已经在这里有了答案 :
LINQ:不同的值 (7个答案)
6年前关闭。
我有班级清单
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" });
我只需要从该列表中选择唯一的ID。即,我的结果列表应仅包含
[{id=1,value="a"},{ id = 2, value = "c" }]
我如何用linq做到这一点?
编辑
输入,
id value 1 a 1 b 2 c 3 d 3 e
输出应该是
id value 1 a 2 c 3 d
即,如果存在的重复id,则结果应仅以第一次出现为准。
id
myList.GroupBy(test => test.id) .Select(grp => grp.First());
编辑:为获得这个IEnumerable<>成List<>似乎是一个神秘的人很多,你可以简单的写:
IEnumerable<>
List<>
var result = myList.GroupBy(test => test.id) .Select(grp => grp.First()) .ToList();
但是,通常最好是使用,IEnumerable而不是IList像上面的Linq那样对它们进行延迟评估:在迭代可枚举之前,它实际上并不会完成所有工作。当您呼叫ToList它时,它实际上遍历了所有难以计数的部分,从而迫使所有工作都必须先完成。(如果您的枚举无限长,可能要花一点时间。)
IEnumerable
IList
ToList
该建议的另一面是,每次您枚举此类IEnumerable工作时,都必须重新进行评估。所以,你需要决定每个案例是否是更好的工作与评估懒洋洋地IEnumerable或将其实现为List,Set,Dictionary或诸如此类的东西。
List
Set
Dictionary