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

4 Solutions collect form web for “select不同的使用LINQ”

 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()) 
  • 如何将expression式树转换为部分SQL查询?
  • entity framework,代码优先和全文search
  • 如何使用dynamic集合的LINQ
  • 从ac#Dictionary中删除多个匹配谓词的项目的最佳方法?
  • dynamic生成LINQ查询
  • 为什么这是一个结构实现?
  • 使用Contains()时遇到2100参数限制(SQL Server)
  • 在Scala中IEnumerable LINQ等价物的图表?
  • 你怎么能处理与LINQ to SQL的IN子查询?
  • NHibernate与LINQ to SQL
  • 如何更新多行使用LINQ到SQL?