C# 获取列表中不同值的列表

C# 获取列表中不同值的列表,c#,linq,list,distinct,C#,Linq,List,Distinct,在C语言中,假设我有一个名为Note的类,它有三个字符串成员变量 public class Note { public string Title; public string Author; public string Text; } 我有一个类型注释列表: List<Note> Notes = new List<Note>(); 获取Author列中所有不同值的列表的最干净的方法是什么 我可以遍历该列表,并将所有不重复的值添加到另一个字符串列

在C语言中,假设我有一个名为Note的类,它有三个字符串成员变量

public class Note
{
    public string Title;
    public string Author;
    public string Text;
}
我有一个类型注释列表:

List<Note> Notes = new List<Note>();
获取Author列中所有不同值的列表的最干净的方法是什么

我可以遍历该列表,并将所有不重复的值添加到另一个字符串列表中,但这看起来既脏又低效。我有一种感觉,有一种神奇的Linq结构可以在一行中实现这一点,但我还没有想出任何办法

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

这将返回作者值的序列IEnumerable-每个唯一值一个。

Jon Skeet编写了一个名为的库,该库具有DistinctBy运算符。有关实现,请参阅。你的代码看起来像

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

按作者区分注释类

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

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

通过使用上述逻辑,我们可以得到独特的课程。

mci到底是什么?只是一个示例表?答案也有点尴尬。是的,我不认为这和我最初的问题是一样的,更不用说是一年半前的事了,这个项目早就完成了。据我所知,如果我已经有一个可能包含重复项的作者字符串列表,但不能用于从将作者字符串作为其字段之一的对象列表中提取这样的列表,那么这将起作用。Notes.Selectx=>x.Author.aspallel.Distinct;如果我们不关心顺序,并且在列表中有更多的项,AsParallel可能会给性能带来一些好处。@Kiquenet,考虑到默认的相等比较器,它是不同的。我们是否需要在.Distinct之前添加ToList?如果您试图转换为列表,则不需要在Distinct之前添加,而是在后面添加。例如:Notes.Selectx=>x.Author.Distinct.ToList@Kirk字符串的IEnumerable是否仍被称为Author或已改为匿名?如何在对列应用了distinct后对其命名?谢谢,谢谢。如果我在调用Distinct方法之前对列表进行排序,我喜欢它保持正确的顺序。我更新了链接。Morelink现在位于Github上,可以通过Nuget:Install Package Morelink安装您的Distinct before ToList节省我的时间。。我是在ToList之后做的,并给出了无法将list转换为Ienumerable的错误。Distinct在这里不起作用,因为对于该运算符,基于对象的哈希代码,每个对象都是唯一的。你需要一些类似的,不是应该是Notes中的Notes吗?GroupBy加上复数s as Note只能容纳一个音符吗?@kkuilla谢谢。
mcilist = (from mci in mcilist select mci).Distinct().ToList();
var DistinctItems = Notes.GroupBy(x => x.Author).Select(y => y.First());

foreach(var item in DistinctItems)
{
    //Add to other List
}
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();