在列表中获取不同值的列表


175

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

public class Note
{
    public string Title;
    public string Author;
    public string Text;
}

而且我有一个类型注释列表:

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

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

我可以遍历该列表,然后将所有不重复的值添加到另一个字符串列表中,但这似乎很脏而且效率低下。我感觉有一些神奇的Linq构造可以在一行中完成,但是我还没办法提出。

Answers:


331
Notes.Select(x => x.Author).Distinct();

这将返回值的序列(IEnumerable<string>Author-每个唯一值一个。


1
Notes.Select(x => x.Author).AsParallel()。Distinct(); 如果我们不关心订单并且列表中有更多项目,则“ AsParallel()”可能会带来一些性能上的好处。
西

1
@Kiquenet,明确考虑Default相等比较器。msdn.microsoft.com/zh-cn/library/bb348436(v=vs.110).aspx
Georg Patscheider

我们是否需要在.Distinct()之前添加ToList()?
潘·比肯(PhanĐưcBình),

1
如果要转换为列表,请在Distinct()之前,而不是之后。例如:Notes.Select(x => x.Author).Distinct()。ToList();
MTwiford '17

87

按作者区分注释类

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

foreach(var item in DistinctItems)
{
    //Add to other List
}

1
是不是应该NotesNotes.GroupBy()与复数sNote将只持有一个单一的注?
kkuilla19年

30

乔恩·斯凯特(Jon Skeet)编写了一个名为morelinq的库,该库具有一个DistinctBy()运算符。有关实现,请参见此处。您的代码看起来像

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

更新: 重新阅读您的问题后,如果您只是在寻找一组独特的作者,柯克将为您提供正确的答案。

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

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

非常好,谢谢。我喜欢如果在调用Distinct方法之前对列表进行排序,它将保持正确的顺序。
Vilhelm

我更新了链接。MoreLINQ现在位于Github上,可以通过Nuget进行安装:Install-Package morelinq
Chad Levy,

2
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();

通过使用以上逻辑,我们可以获得唯一Course的。


您在ToList之前的区别节省了我的时间。.我在ToList之后做,并给出了无法将列表转换为Ienumerable的错误。
Ajay2707 '19

区别在这里不起作用,因为对于该运算符,每个对象基于对象的哈希码都是唯一的。您需要与此类似的东西-github.com/morelinq/MoreLINQ/blob/master/MoreLinq/DistinctBy.cs
Bose_geek

-2
mcilist = (from mci in mcilist select mci).Distinct().ToList();

什么是mci?只是一个示例表?答案还是有点尴尬。
布莱德·科赫

1
是的,我认为这不是我最初的问题所要解决的(没关系,这是一年半以前,该项目已经完成很长时间了)。据我所知,如果我已经具有一个可能包含重复项的Author字符串列表,但不能用于从具有Author字符串作为其字段之一的对象列表中提取这样的列表,则此方法有效。
Darrel Hoffman
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.