在List中获取不同值的列表

时间:2012-04-21 00:31:33

标签: c# linq list distinct

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

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

我有一个注释类型列表:

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

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

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

5 个答案:

答案 0 :(得分:283)

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

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

答案 1 :(得分:66)

按作者

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

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

答案 2 :(得分:28)

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

答案 3 :(得分:1)

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 s。

答案 4 :(得分:-2)

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