LINQ를 사용하여 사전 <T1, T2>을 선택하십시오.


171

"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> { ...

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

감사.

답변:


284

확장 메소드는 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"값을 포함합니다


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

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


27
.ToDictionary(item => item.prop1, item => item.prop2);명시 적으로 값을 설정하십시오.
finoutlook

42

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

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

.ToDictionary (x => x.Key, x => x.Value)를 제거 할 수 있습니까? 새 KeyValuePair를 새 사전으로 바꾸시겠습니까?
Amir Hajiha 2018 년

@ AmirNo-Family 당신은 착각입니다. Select (x => x ...) 메소드는 객체 컬렉션의 각 요소에 대한 투영을 수행합니다 . 따라서 새 KeyValuePair를 새 사전으로 바꾸면 사전 사전이 작성됩니다. 나는 그것이 당신이 목표로하고 있다고 생각하지 않습니다.
Antoine Meltzheim

Dictionary <string, string> 목록이 있고 select를 사용하려고했지만 컴파일 오류가 발생합니다.
Amir Hajiha 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.