LINQ를 사용하여 사전 <T1, T2>을 선택하십시오. 사용하여을 리턴 했지만

“select”키워드와 확장 메소드를 사용 IEnumerable<T>하여 LINQ를 사용하여을 리턴 했지만 일반을 리턴해야하며 Dictionary<T1, T2>이를 파악할 수 없습니다. 내가 배운 예는 다음과 비슷한 형태로 무언가를 사용했습니다.

IEnumerable<T> coll = from x in y
    select new SomeClass{ prop1 = value1, prop2 = value2 };

확장 방법으로도 같은 작업을 수행했습니다. 위의 예제에서 “SomeClass”를 “”로 바꿀 Dictionary<T1, T2>수 있기 때문에의 항목을 반복 할 수 있다고 가정 했지만 작동하지 않습니다 (Key 및 Value는 읽기 전용으로 표시되어 있으므로이 코드를 컴파일 할 수 없습니다) ).KeyValuePair<T1, T2>new KeyValuePair<T1, T2> { ...

이것이 가능합니까, 아니면 여러 단계로 수행해야합니까?

감사.



답변

확장 메소드는 ToDictionary 확장 도 제공합니다 . 사용하는 것은 매우 간단하지만 일반적인 사용법은 키에 대한 람다 선택기를 전달하고 객체를 값으로 가져 오는 것이지만 키와 값 모두에 대해 람다 선택기를 전달할 수 있습니다.

class SomeObject
{
    public int ID { get; set; }
    public string Name { get; set; }
}

SomeObject[] objects = new SomeObject[]
{
    new SomeObject { ID = 1, Name = "Hello" },
    new SomeObject { ID = 2, Name = "World" }
};

Dictionary<int, string> objectDictionary = objects.ToDictionary(o => o.ID, o => o.Name);

그런 다음 objectDictionary[1]“Hello”값을 포함합니다


답변

var dictionary = (from x in y
                  select new SomeClass
                  {
                      prop1 = value1,
                      prop2 = value2
                  }
                  ).ToDictionary(item => item.prop1);

그것이 그것이 사전에 SomeClass.prop1바람직한 것이라고 가정합니다 Key.


답변

컬렉션 KeyValuePair은 훨씬 명시 적이며 매우 잘 실행됩니다.

Dictionary<int, string> dictionary = objects
    .Select(x=> new KeyValuePair<int, string>(x.Id, x.Name))
    .ToDictionary(x=>x.Key, x=>x.Value);