在C#中,假设我有一个名为Note的类,其中包含三个String成员变量。
public class Note
{
public string Title;
public string Author;
public string Text;
}
我有一个注释类型列表:
List<Note> Notes = new List<Note>();
获取“作者”列中所有不同值的列表最简洁的方法是什么?
我可以遍历列表并将所有不重复的值添加到另一个字符串列表中,但这看起来很脏且效率低下。我有一种感觉,有一些神奇的Linq结构可以在一行中完成,但我无法想出任何东西。
答案 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();