如何使用Linq从对象列表中获取属性的唯一列表?


171

我正在尝试使用Linq返回给定的id列表,其中id是属性的对象列表。我希望能够做到这一点,而无需遍历每个对象并提取出我发现的唯一ID。

我有一个MyClass类型的对象列表,此类的属性之一是ID。

public class MyClass
{
  public int ID { get; set; }
}

我想做的是编写一个Linq查询以向我返回这些ID的列表

给定一个IList<MyClass>使得返回IEnumerable<int>ID的ID ,我该怎么做?

我确信使用Linq可以在一两行中完成此操作,而不是循环遍历MyClass列表中的每个项目并将唯一值添加到列表中。

在创建一个优雅的解决方案的任何帮助将不胜感激!


1
另请注意,您DistinctByMoreLinq中拥有MyClass基于的不同s ID。用法:var distincts = list.DistinctBy(x => x.ID);
nawfal

Answers:


319
IEnumerable<int> ids = list.Select(x=>x.ID).Distinct();

哇!我认为这很简单...我只是想不到。看来我将不得不花更多时间来熟悉Linq。
mezoid

29

使用Distinct运算符

var idList = yourList.Select(x=> x.ID).Distinct();

5
(较小的命名点;它不是ID的“列表”-它是惰性计算的IEnumerable <int>-除非您当然调用.ToList();
Marc Gravell

@Marc,简单的两行懒惰评估?请和谢谢:D
masfenix 2010年

2
@masfenix Lazy eval表示该操作只有在实际使用后才能完成。在这种情况下,执行此答案中的语句时,不一定要选择ID和仅选择不同的ID。当您实际开始遍历idList时(例如在foreach循环中),将完成此操作。
Mark Meuer 2014年

13

使用直线LinqDistinct()扩展名为:

var idList = (from x in yourList select x.ID).Distinct();

3
        int[] numbers = {1,2,3,4,5,3,6,4,7,8,9,1,0 };
        var nonRepeats = (from n in numbers select n).Distinct();


        foreach (var d in nonRepeats)
        {

            Response.Write(d);
        }

输出值

1234567890


1
不回答问题,即使回答,也不会增加任何新内容。
2013年

2

当采用Distinct时,我们也必须转换为IEnumerable。如果列表是模型,则需要编写这样的代码

 IEnumerable<T> ids = list.Select(x => x).Distinct();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.