ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在尝试使用 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 为您提供不同的 MyClass。用法:var distincts = list.DistinctBy(x => x.ID);

M
Marc Gravell
IEnumerable<int> ids = list.Select(x=>x.ID).Distinct();

哇!我以为这很简单……我只是想不出来。看来我将不得不花更多时间熟悉 Linq。
M
Maksim Vi.

使用 Distinct operator

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

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

使用直接 LINQ,带有 Distinct() 扩展:

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

P
Peter Mortensen

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

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

P
Peter Mortensen
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


不回答这个问题,即使回答了,也没有增加任何新内容。