[C#] List에서 고유 한 값 목록 가져 오기

C #에서는 세 개의 String 멤버 변수가있는 Note라는 클래스가 있다고 가정합니다.

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

그리고 참고 유형 목록이 있습니다.

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

저자 열에서 모든 고유 값 목록을 얻는 가장 깨끗한 방법은 무엇입니까?

목록을 반복하고 다른 문자열 목록에 중복되지 않는 모든 값을 추가 할 수는 있지만 더럽고 비효율적입니다. 한 줄에 이것을 할 마법의 Linq 구조가 있다고 생각하지만 아무것도 만들 수 없었습니다.



답변

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

고유 값당 하나씩 일련 IEnumerable<string>Author값 ( )을 반환 합니다.


답변

저자별 노트 클래스 구분

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

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


답변

Jon Skeet은 운영자 가있는 morelinq 라는 라이브러리를 작성했습니다 DistinctBy(). 구현에 대해서는 여기 를 참조 하십시오 . 코드는 다음과 같습니다

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

업데이트 :
질문을 다시 읽은 후 Kirk는 다른 저자를 찾고 있다면 정답을 얻습니다.

DistinctBy에 몇 가지 필드 샘플이 추가되었습니다.

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


답변

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


답변