2014-05-15 2 views
-1

상태 오늘은 다음과 같습니다.사전 LINQ를 사용하여 사전 선택

IEnumerable<Beep> 
    as = list.Where(e => e.Name == "A").Select(e => e.Property), 
    bs = list.Where(e => e.Name == "B").Select(e => e.Property); 
Dictionary<String, IEnumerable<Beep>> 
    = new Dictionary<String, IEnumerable<Beep>>() 
    { { "A", as }, { "B", bs } }; 

하나의 문장에서 LINQ 표현식을 직접적으로 만들 수있는 리팩토링 방법이 궁금합니다.

+3

'사전 <문자열, IEnumerable을 >'! ='사전 <문자열, IEnumerable을 > '당신이 컴파일 제공 할 수있는 코드를해야 할 것인가? 이것은 충분히 혼란 스럽다. –

+0

이 질문은 작업 코드의 코드 검토에 관한 주제이기 때문에이 질문은 논점을 벗어난 것으로 보입니다. – Servy

+0

@Servy 코드 검토가 전혀 아닙니다. 가능하다면 하나의 명령문으로 작업을 수행하는 방법에 대한 질문입니다. –

답변

4

을 받고 있기 때문에 ToDictionary()을 실제로 원하지 않습니다. 대신 ToLookup()의 종류입니다.

var result = list.ToLookup(x => x.Name, x => x.Property); 

Dictionary<String, IEnumerable<Beep>>

중요 사항에 해당이 의지를 출력 ILookup<string, Beep>! 이 방법을 사용하는 것에 대한 한 가지 결말은 결과물 인 ILookup을 더 수정하여 나중에 Dictionary<string, IEnumerable<Beep>>이있는 항목을 처음 추가 한 후에 항목을 더 추가 할 수있게하는 것입니다. 당신이 사전을 원하는 경우에 당신은

var result = list.GroupBy(x=>x.Name) 
    .ToDictionary(x=> x.Key, x=>x.Select(y=> y.Property)); 
+0

Property의 타입이'IEnumerable '일 경우 어떻게'.ToLookup (x => x.Name, x => x.Property);''ILookup '을 돌려 주나요? –

+0

@ Selman22 속성의 타입이'IEnumerable '이면 첫 번째 버전은'ILookup '을 출력 할 것이고 두번째 버전도 바뀔 것입니다. 이것은'var'을 사용하는 좋은 이유 중 하나입니다. 데이터 유형이 변경되면 코드를 수정해야 할 수 있습니다. –

+0

아니요,'ILookup >' –