获取 List 中不同值的列表

Posted

技术标签:

【中文标题】获取 List 中不同值的列表【英文标题】:Get a list of distinct values in List 【发布时间】:2012-05-02 13:32:05 【问题描述】:

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

public class Note

    public string Title;
    public string Author;
    public string Text;

我有一个Note 类型的列表:

List<Note> Notes = new List<Note>();

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

我可以遍历列表并将所有不重复的值添加到另一个字符串列表中,但这似乎很脏且效率低下。我有一种感觉,有一些神奇的 Linq 构造可以在一行中完成此操作,但我无法想出任何东西。

【问题讨论】:

【参考方案1】:
Notes.Select(x => x.Author).Distinct();

这将返回Author 值的序列 (IEnumerable&lt;string&gt;) -- 每个唯一值一个。

【讨论】:

Notes.Select(x => x.Author).AsParallel().Distinct();如果我们不关心顺序并且列表中有更多项目,“AsParallel()”可能会带来一些性能优势。 @Kiquenet,与 Default 相等比较器不同。 msdn.microsoft.com/en-us/library/bb348436(v=vs.110).aspx 我们需要在.Distinct()之前添加ToList()吗? 不是在 Distinct() 之前,而是在之后,如果您尝试转换为列表。例如:Notes.Select(x => x.Author).Distinct().ToList(); @Kirk 字符串的 IEnumerable 是否仍称为“作者”或已更改为匿名?如何在对列应用不同后命名列?谢谢【参考方案2】:

Jon Skeet 编写了一个名为 morelinq 的库,其中包含 DistinctBy() 运算符。有关实施,请参阅here。你的代码看起来像

IEnumerable<Note> distinctNotes = Notes.DistinctBy(note => note.Author);

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

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

res = res.DistinctBy(i => i.Name).DistinctBy(i => i.ProductId).ToList();

【讨论】:

太好了,谢谢。如果我在调用 Distinct 方法之前对列表进行排序,我喜欢它保持正确的顺序。 我更新了链接。 MoreLINQ 现在在 Github 上,可以通过 Nuget 安装:Install-Package morelinq【参考方案3】:
mcilist = (from mci in mcilist select mci).Distinct().ToList();

【讨论】:

mci 到底是什么?只是一个示例表?答案有点尴尬。 是的,我认为这不是我最初的问题所要寻找的(别介意那是一年半前,该项目早就完成了)。据我所知,如果我已经有一个可能包含重复项的作者字符串列表,但不能用于从将作者字符串作为其字段之一的对象列表中提取这样的列表,这将起作用。 【参考方案4】:

按作者区分 Note 类

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

foreach(var item in DistinctItems)

    //Add to other List

【讨论】:

不应该是NotesNotes.GroupBy() 一样的复数s 因为Note 只能容纳一个Note?【参考方案5】:
public class KeyNote

    public long KeyNoteId  get; set; 
    public long CourseId  get; set; 
    public string CourseName  get; set; 
    public string Note  get; set; 
    public DateTime CreatedDate  get; set; 


public List<KeyNote> KeyNotes  get; set; 
public List<RefCourse> GetCourses  get; set;     

List<RefCourse> courses = KeyNotes.Select(x => new RefCourse  CourseId = x.CourseId, Name = x.CourseName ).Distinct().ToList();

通过上面的逻辑,我们可以得到唯一的Courses。

【讨论】:

你在 ToList 之前的 Distinct 节省了我的时间。我在 ToList 之后做,并给出了无法将列表转换为 Ienumerable 的错误。 Distinct 在这里不起作用,因为对于这个运算符,每个对象都是唯一的,基于对象的哈希码。你需要一些类似的东西 - github.com/morelinq/MoreLINQ/blob/master/MoreLinq/DistinctBy.cs

以上是关于获取 List 中不同值的列表的主要内容,如果未能解决你的问题,请参考以下文章

获取具有不同类型的 id 值的员工列表作为输出中的列名

Django Annotate - 获取不同字段值的列表

获取列表/数组的最小值的问题

pyspark:获取列表值的不同元素

jQuery - 从类的元素中获取属性值的列表

获取字典最小值的键,而该键在数组中