217

在 C# 中,假设我有一个Note使用三个字符串成员变量调用的类。

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

我有一个类型列表Note

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

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

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

4

5 回答 5

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

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

于 2012-04-21T00:33:46.153 回答
117

按作者区分 Note 类

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

foreach(var item in DistinctItems)
{
    //Add to other List
}
于 2014-06-23T07:01:11.657 回答
37

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

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

更新: 重新阅读您的问题后,如果您只是在寻找一组不同的作者,柯克有正确的答案。

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

res = res.DistinctBy(i => i.Name).DistinctBy(i => i.ProductId).ToList();
于 2012-04-21T00:37:38.790 回答
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的 s。

于 2017-11-23T05:25:03.323 回答
-3
mcilist = (from mci in mcilist select mci).Distinct().ToList();
于 2013-10-09T21:26:15.310 回答