一尘不染

使用linq选择不重复[重复]

c#

这个问题已经在这里有了答案

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,则结果应仅以第一次出现为准。


阅读 267

收藏
2020-05-19

共1个答案

一尘不染

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它时,它实际上遍历了所有难以计数的部分,从而迫使所有工作都必须先完成。(如果您的枚举无限长,可能要花一点时间。)

该建议的另一面是,每次您枚举此类IEnumerable工作时,都必须重新进行评估。所以,你需要决定每个案例是否是更好的工作与评估懒洋洋地IEnumerable或将其实现为ListSetDictionary或诸如此类的东西。

2020-05-19