在List中获取不同值的列表

Dar*_*man 160 c# linq list distinct

在C#中,假设我有一个名为Note的类,其中包含三个String成员变量.

public class Note
{
    public string Title;
    public string Author;
    public string Text;
}
Run Code Online (Sandbox Code Playgroud)

我有一个类型列表注意:

List<Note> Notes = new List<Note>();
Run Code Online (Sandbox Code Playgroud)

获取"作者"列中所有不同值的列表最简洁的方法是什么?

我可以遍历列表并将所有不重复的值添加到另一个字符串列表中,但这看起来很脏且效率低下.我有一种感觉,有一些神奇的Linq结构可以在一条线上做到这一点,但我无法想出任何东西.

Kir*_*oll 307

Notes.Select(x => x.Author).Distinct();
Run Code Online (Sandbox Code Playgroud)

这将返回值的sequence(IEnumerable<string>)Author- 每个唯一值一个.

  • 不是在 Distinct() 之前而是之后,如果您尝试转换为列表。例如:Notes.Select(x =&gt; x.Author).Distinct().ToList(); (3认同)
  • Notes.Select(x =&gt; x.Author).AsParallel().Distinct(); 如果我们不关心顺序并且列表中有更多项目,“AsParallel()”可能会带来一些性能优势。 (2认同)

ati*_*ker 74

由作者区分Note类

var DistinctItems = Note.GroupBy(x => x.Author).Select(y => y.First());

foreach(var item in DistinctItems)
{
    //Add to other List
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*sha 29

Jon Skeet编写了一个名为morelinq的库,它有一个DistinctBy()运算符.请参阅此处了解实施情况.你的代码看起来像

IEnumerable<Note> distinctNotes = Notes.DistinctBy(note => note.Author);
Run Code Online (Sandbox Code Playgroud)

更新: 重新阅读您的问题后,如果您只是寻找一组独特的作者,Kirk会得到正确的答案.

添加了示例,DistinctBy中的几个字段:

res = res.DistinctBy(i => i.Name).DistinctBy(i => i.ProductId).ToList();
Run Code Online (Sandbox Code Playgroud)