List에서 고유 한 값 목록 가져 오기


175

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

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

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

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

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

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

답변:


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

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


1
Notes.Select (x => x.Author) .AsParallel (). Distinct (); "AsParallel ()"은 주문에 신경 쓰지 않고 목록에 더 많은 항목이 있으면 성능상의 이점을 제공 할 수 있습니다.
Sai

1
@Kiquenet, Default평등 비교자를 고려하여 구별하십시오 . msdn.microsoft.com/ko-kr/library/bb348436(v=vs.110).aspx
Georg Patscheider

.Distinct () 전에 ToList ()를 추가해야합니까?
Phan Đức Bình

1
목록으로 변환하려는 경우 Distinct () 이전이 아니라 이후입니다. 예 : Notes.Select (x => x.Author) .Distinct (). ToList ();
MTwiford

87

저자별 노트 클래스 구분

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

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

1
그것이 있어야되지 Notes같이 Notes.GroupBy()복수와 s같은 Note단 하나의 참고를 개최한다?
kkuilla

30

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

훌륭 해요, 고맙습니다. Distinct 메서드를 호출하기 전에 목록을 주문하면 올바른 순서를 유지하는 것이 좋습니다.
Vilhelm

링크를 업데이트했습니다. MoreLINQ는 Github에서 지금과 Nuget를 통해 설치할 수 있습니다Install-Package morelinq
차드 레비

2
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.


ToList 이전의 구별은 시간을 절약 해줍니다. ToList를 수행하고 있는데 목록을 Ienumerable로 변환 할 수없는 오류가 발생합니다.
Ajay2707

이 연산자의 경우 모든 객체가 객체의 해시 코드를 기반으로 고유하기 때문에 구별이 작동하지 않습니다. 이것과 비슷한 것이 필요합니다 -github.com/morelinq/MoreLINQ/blob/master/MoreLinq/DistinctBy.cs
Bose_geek

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

정확히 mci는 무엇입니까? 예제 테이블 만? 대답은있는 그대로 조금 어색합니다.
Brad Koch

1
네, 이것이 원래의 질문에서 찾은 것을하지 않는다고 생각합니다 (1 년 반 전에는 프로젝트가 끝났다고 생각하지 마십시오). 내가 알 수있는 것에서, 이것은 이미 중복을 포함 할 수있는 Author 문자열 목록이 있었지만 Author 문자열을 필드 중 하나로 갖는 객체 목록에서 그러한 목록을 추출하는 데 사용할 수없는 경우 작동합니다.
Darrel Hoffman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.