2010-01-21 2 views
4

개체 목록이 있습니다. 각 개체에는 'DisplayName'이라는 속성이 있습니다.Lambda/Linq를 사용하여 컬렉션의 항목 목록 가져 오기?

문자열 목록의 다른 목록을 만들려고합니다. 각 문자열은 초기 목록의 모든 개체에 대한 DisplayName 속성의 첫 번째 문자 또는 문자 (숫자 일 수 있음)를 나타내며 목록을 고유하게 만듭니다.

따라서, 예를 들어, 내 목록은 다음과 같은 세 가지 목적이 포함 된 경우 :

(1) 표시 이름 = '앤서니' (2) 표시 이름 = '데니스' (3) 표시 이름 = '존'

(1) 'A' (2) 'D' (3) 'J'

어떤 생각 방법 :

나는 다음과 같은 세 가지 문자열을 포함하는 또 다른 목록을 생성 할 것 람다 식 또는 linq를 사용하여 최소한의 코딩으로이 작업을 수행합니까? 이처럼

+0

왜 linq을 사용해야합니까? –

답변

3

:

list.Select(o => o.DisplayName[0].ToString()) 
    .Where(s => Char.IsLetter(s, 0)) 
    .Distinct().ToList(); 

편집

+0

감사합니다. 알파가 아닌 문자가 포함 된 결과를 필터링 할 수 있습니까? 첫 글자가 숫자 또는 기호라면 괜찮 았음을 알리는 원래의 글을 알았지 만 반환 된 결과를 필터링 할 수 있는지 궁금합니다. – Chris

+0

Char에서 정적 메서드 중 하나와 함께 Where 호출을 사용합니다. – SLaks

0

또는 쿼리 표기법 : 위의 코드에서

var stringList = (from a in objectList 
         select a.DisplayName.Substring(0,1)).Distinct(); 
+0

쿼리 이해 구문이 과대 평가되었습니다. – SLaks

1
List<myObject> mylist = new List<myObject>(); 
//populate list 
List<string> myStringList = myList 
    .Select(x => x.DisplayName.Substring(0,1)) 
    .Distinct() 
    .OrderBy(y => y); 

, Select (는 람다는 것 포함) 단지를 반환 객체의 표시 이름에서 첫 번째 문자 x. 그러면 string 유형의 IEnumerable이 생성되고 Distinct()으로 전달됩니다. 이렇게하면 목록에 고유 항목 만 있어야합니다. 마지막으로 OrderBy은 항목이 사전 순으로 정렬되도록합니다.

목록에있는 각 개체의 유형이 다른 경우 x.DisplayName을 호출 할 수 없습니다. 이 경우 IDisplayName이라고하는 인터페이스를 만들고 DisplayName을 구현합니다. 그렇다면 람다 안에서 x => ((IDisplayName)x).DisplayName.Substring(0,1)을 사용할 수 있어야합니다.

관련 문제