Получить список различных значений в списке

В С#, скажем, у меня есть класс под названием Note с тремя переменными-членами String.

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

И у меня есть список типов Примечание:

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

Каким будет самый чистый способ получить список всех различных значений в столбце Author?

Я мог выполнять итерацию по списку и добавлять все значения, которые не дублируются в другой список строк, но это кажется грязным и неэффективным. У меня есть ощущение какой-то магической конструкции Linq, которая сделает это в одной строке, но я ничего не смог придумать.

Ответ 1

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

Это вернет последовательность (IEnumerable<string>) значений Author - по одному на уникальное значение.

Ответ 2

var DistinctItems = employees.GroupBy(x => x.EmpID).Select(y => y.First());

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

Ответ 3

Джон Скит написал библиотеку под названием morelinq, которая имеет оператор DistinctBy(). См. здесь для реализации. Ваш код будет выглядеть как

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

Update: После повторного чтения вашего вопроса у Кирка есть правильный ответ, если вы просто ищете отдельный набор авторов.

Добавлен образец, несколько полей в DistinctBy:

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

Ответ 4

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

Используя вышеприведенную логику, мы можем использовать уникальные курсы.

Ответ 5

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