在 C# 中,假设我有一个名为 Note
的类,其中包含三个字符串成员变量。
public class Note
{
public string Title;
public string Author;
public string Text;
}
我有一个 Note
类型的列表:
List<Note> Notes = new List<Note>();
在 Author 列中获取所有不同值的列表的最简洁方法是什么?
我可以遍历列表并将所有不重复的值添加到另一个字符串列表中,但这似乎很脏且效率低下。我有一种感觉,有一些神奇的 Linq 构造可以在一行中完成此操作,但我无法想出任何东西。
Notes.Select(x => x.Author).Distinct();
这将返回 Author
个值的序列 (IEnumerable<string>
) - 每个唯一值一个。
按作者区分 Note 类
var DistinctItems = Notes.GroupBy(x => x.Author).Select(y => y.First());
foreach(var item in DistinctItems)
{
//Add to other List
}
Notes
和 Notes.GroupBy()
中的复数 s
,因为 Note
只能容纳一个单注吗?
Jon Skeet 编写了一个名为 morelinq 的库,其中包含一个 DistinctBy()
运算符。有关实施,请参见 here。你的代码看起来像
IEnumerable<Note> distinctNotes = Notes.DistinctBy(note => note.Author);
更新:重新阅读您的问题后,如果您只是在寻找一组不同的作者,柯克有正确的答案。
添加了示例,DistinctBy 中的几个字段:
res = res.DistinctBy(i => i.Name).DistinctBy(i => i.ProductId).ToList();
Install-Package morelinq
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
。
mcilist = (from mci in mcilist select mci).Distinct().ToList();
Default
相等比较器是不同的。 msdn.microsoft.com/en-us/library/bb348436(v=vs.110).aspx