2012-04-21 3 views
103

C#에서는 세 개의 String 멤버 변수가있는 Note라는 클래스가 있다고 가정 해 보겠습니다.목록의 고유 한 값 목록 가져 오기

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

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

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

것은 무엇 저자 열의 모든 고유 값의 목록을 얻을 수있는 가장 깨끗한 방법이 될 것입니까?

목록을 반복하고 중복되지 않은 모든 값을 다른 문자열 목록에 추가 할 수는 있지만 더럽고 비효율적 인 것처럼 보입니다. 나는 한 줄로 할 수있는 마법의 Linq 구조가 있다는 느낌이 들지만, 나는 아무 것도 생각 해낼 수 없었다. 고유 값 당 -

답변

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

Author 값들의 시퀀스 (IEnumerable<string>)를 반환한다.

+0

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

+1

@Kiquenet,'Default' 평등 비교자를 고려하면 별개입니다. https://msdn.microsoft.com/en-us/library/bb348436(v=vs.110).aspx –

+0

.Distinct() 전에 ToList()를 추가해야합니까? –

24

Jon Skeet은 morelinq이라는 라이브러리에 DistinctBy() 연산자가 있습니다. 구현 방법은 here을 참조하십시오. 코드는

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

업데이트 같을 것이다 : 당신은 단지 저자의 독특한 세트를 찾고 있다면 질문을 다시 읽어 후, 커크는 정답이있다. DistinctBy에서

추가 샘플, 여러 분야 :

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

https://code.google.com/p/morelinq/source/browse/trunk/MoreLinq/DistinctBy.cs 404 오류 – Kiquenet

+0

DistinctBy 소스에 대한 링크가 업데이트되었습니다. –

+0

우수합니다. 감사합니다. 나는 Distinct 메서드를 호출하기 전에 목록을 정렬하면 올바른 순서를 유지하는 것이 좋습니다. – Vilhelm

-1
mcilist = (from mci in mcilist select mci).Distinct().ToList(); 
+0

mci 란 정확히 무엇입니까? 예제 테이블? 대답은 약간 어색합니다. –

+0

그래, 내 원래의 질문이 찾고 있었던 것 같지 않아. (1 년 반 전의 프로젝트 였어. 내가 말할 수있는 것부터, 중복을 포함 할 수있는 작성자 문자열의 목록을 이미 가지고 있지만 작성자 문자열이 필드 목록 중 하나 인 객체 목록에서 그러한 목록을 추출하는 데 사용할 수없는 경우이 작업이 가능합니다. –

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

foreach(var item in DistinctItems) 
{ 
    //Add to other List 
} 
0
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(); 

우리는 독특한 과정을 할 수있는 논리 위에 사용하여.

관련 문제