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

Posted

技术标签:

【中文标题】如何使用 LINQ 从对象列表中获取唯一的属性列表?【英文标题】:How do I use LINQ to obtain a unique list of properties from a list of objects? 【发布时间】:2021-05-02 19:22:27 【问题描述】:

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

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

public class MyClass

  public int ID  get; set; 

我想编写一个 LINQ 查询来返回这些 Id 的列表。

如果给定一个IList<MyClass>,它会返回一个IEnumerable<int> 的ID,我该怎么做?

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

【问题讨论】:

另外请注意,您在MoreLinq 中有DistinctBy,这将根据ID 为您提供不同的MyClasss。用法:var distincts = list.DistinctBy(x => x.ID); 【参考方案1】:
IEnumerable<int> ids = list.Select(x=>x.ID).Distinct();

【讨论】:

哇!我以为这很简单……我只是想不出来。看来我得花更多时间熟悉 Linq。【参考方案2】:

使用Distinct operator:

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

【讨论】:

(次要命名点;它不是 id 的“列表”——它是一个惰性求值的 IEnumerable——当然,除非你调用 .ToList() ;-p)跨度> @Marc,一个简单的 2 行懒惰评估解释?请和谢谢:D @masfenix Lazy eval 表示操作直到实际使用才完成。在这种情况下,在执行此答案中的语句时,不一定要选择 ID 并仅选择不同的 ID。它会在您真正开始遍历 idList 时完成,例如在 foreach 循环中。【参考方案3】:

直接使用LINQ,扩展名为Distinct()

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

【讨论】:

【参考方案4】:

当采用Distinct时,我们也必须转换成IEnumerable。如果列表是 模型,则意味着您需要编写如下代码:

 IEnumerable<T> ids = list.Select(x => x).Distinct();

【讨论】:

【参考方案5】:
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

【讨论】:

不回答问题,即使回答了,也不会添加任何新内容。

以上是关于如何使用 LINQ 从对象列表中获取唯一的属性列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 Linq 的情况下从列表中获取一些对象?

使用 Linq 从列表中删除与属性相交的项目

使用 LINQ 获取两个比较列表的结果并根据结果更改列表中的属性

c# 如何获取列表中某个属性最大或最小的元素?

Linq 从一个列表中获取对象,其中其他整数列表包含在第一个列表中

如何从内存列表中获取一组不同的属性值?