LINQ-값을 목록으로 사용하여 목록을 사전으로 변환


99

나는

List<MyObject> 

데이터베이스에서 검색합니다. 그러나 그룹화 목적으로 MyObject의 속성으로 키를 지정하고 싶습니다. LINQ에서 내 목록을 다음으로 캐스팅하는 가장 좋은 방법은 무엇입니까?

Dictionary<long, List<MyObject>>

다음이 있습니다.

myObjectList.ToDictionary(x => x.KeyedProperty)

그러나 다음을 반환합니다.

Dictionary<long, MyObject>

MyObject의 속성에 맞는 사전을 원하십니까? -전체 목록이 있습니다 ...
James Curran

답변:


192

당신이 그룹에 원하는 것 같은데 MyObject하여 인스턴스 KeyedProperty와로 그룹화 것을 넣어 Dictionary<long,List<MyObject>>. 그렇다면 다음을 시도하십시오.

List<MyObject> list = ...;
var map = list
  .GroupBy(x => x.KeyedProperty)
  .ToDictionary(x => x.Key, x => x.ToList());

16

다음 과 같이 클래스 에서 ToLookup확장 메서드 를 사용해야합니다 .Enumerable

List<MyObject> list = ...;

ILookup<long, MyObject> lookup = list.ToLookup(o => o.KeyedProperty);

사전에 배치하려면 다음 과 같이 ToDictionary확장 메서드를 사용할 수 있습니다 .

IDictionary<long, IEnumerable<MyObject>> dictionary = lookup.ToDictionary(
    l => l.Key);

이것과 받아 들여진 대답의 차이점은 무엇입니까? ILookup수락 된 답변은 그렇지 않은 반면 참조를 보존 합니까 ?
PatPeter

@PatPeter 아이디어는 키와 항목 사이에 일대 다 관계가 Lookup<TKey, TValue>있을 때 a가 Dictionary<TKey, TValue>.
casperOne 19

1
@PatPeter 나는 ILookup이 사용하기에 더 나은 구조라고 말하고 싶습니다 (C ++ 수집 알고리즘을 알고 있다면 dictonary의 맵에 대한 멀티 맵과 같습니다). 나중에 항목을 추가하거나 제거 할 수 없습니다.
gbjbaanb

또 다른 고려 사항은 ILookup이상적인 인 코드 구조이지만 직렬화를 위해 잘 처리되지 않는 경우가 많다는 것입니다.
Jeff B
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.