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

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


Jon Skeet写了一个叫做morelinq的库,它有一个DistinctBy()操作符。参见这里的实现。您的代码看起来像

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

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

增加了sample, DistinctBy中的几个字段:

res = res.DistinctBy(i => i.Name).DistinctBy(i => i.ProductId).ToList();

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

通过Author区分Note类

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

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


@if (dataModal.Count > 0) { var DistinctItems = dataModal.GroupBy(x => x.Year).Select(y => y.First()); <div class="col-md-3"> <label class="fs-7 form-label text-muted">@Localizer["Year"]</label> <InputSelect id="ddlYears" class="form-select" @bind-Value="filter.Year"> <option value="">@Localizer["Select"]</option> @foreach (var year in DistinctItems) { <option value="@year.Year"> @year.Year </option> } </InputSelect> </div> }