사전

2012-06-25 2 views
1

에 대한 일치) (가능하면 중복 유지 : 당신이 IEnumerable<KeyValuePair<TKey, TSource>>로 끝나는 Dictionary<TKey, TValue> 유형의 사전에 어디 방법을 사용하고이 파괴되면
Recreating a Dictionary from an IEnumerable사전

을 내가 처음에 선택했던 데이터 유형. 나는 사전을 돌려주고 싶다.

아마도 올바른 필터 기능을 사용하고 있지 않을 수 있습니다. 그렇다면 사전에 요소를 필터링하는 방법은 무엇입니까?

감사

+0

사전을 필터링 할 때 무엇을 기대합니까? 값 또는 키? – Madman

+0

http://stackoverflow.com/a/2636628/1004522 –

답변

2

IDictionary<TKey, TValue> 실제로는 IEnumerable<KeyValuePair<TKey, TValue>>입니다. 이것은 처음에 IDictionary<TKey, TValue>에서 LINQ 연산자를 사용할 수있는 이유입니다.

그러나 LINQ 연산자는 deferred execution을 제공하기위한 것이며 결과는 IEnumerable<T>을 통해 반복하기 시작할 때까지 실제로 생성되지 않는다는 것을 의미합니다.

IDictionary<TKey, TValue>에서 제공하는 IEnumerable<T> 구현의 방법으로 오는 ICollection<T> interface이 원칙의 위반, LINQ 대신 IEnumerable<KeyValuePair<TKey, TValue>>IDictionary<TKey, TValue>를 반환한다면 다음 목록을 구체화해야한다는 것을 의미한다 (TKeyValuePair<TKey, TValue> 임) (따라서 IEnumerable<KeyValuePair<TKey, TValue>> 반환 값).

당연히 주위에 Enumerable class에있는 ToDictionary 확장 방법을 호출하는 것이지만 (다른 사람들이 언급 한 것처럼), 약간의 뒷 이야기는 결코 아프지 않습니다.

+0

IMHO 사전에 모든 LINQ 쿼리를 "상속"하는 것이 좋지 않습니다. 특히 지연된 실행은 사전에 대해 갖는 재미있는 기능이 아닙니다. 클로저를 허용하는 적절한 메소드를 가진 클리너 API가 더 좋았을 것입니다. – mathk

+0

@mathk 사전에 문제가있는 것은 아니지만 ICollection '을 구현한다는 사실입니다. 여러분이 제안하는 것은'ICollection '을 구현하는 모든 것이 * each * 연산 후에 결과 집합을 구체화한다는 것입니다. 그것은 * ICELlection '* 이후의 * 질의 연산 (* 모든'select','where','let' 등)을 실현해야하기 때문에 비효율적입니다. – casperOne

+0

내가 말하는 것은 아닙니다. 나는 그것이 모든 LINQ qyuery를 상속 받아서는 안된다는 것을 말하고 있습니다. 사전에 대한 질의 작업을 수행하는 데 많은주의를 기울이지 않습니다. 특히 쿼리 표현식은 게으르다. 하스켈 게으른 평가만큼 좋지 않다. – mathk

1

방법에 대한 .ToDictionary() 결국?

1

당신은 Where()을 사용하고 ToDictionary()에 따를 수 있습니다 : 당신의 LINQ 표현에

var newDict = yourDict.Where(pair => SomePredicateFrom(pair)) 
         .ToDictionary(pair => pair.Key, pair => pair.Value); 
+0

나는 일반적으로 To *() 메서드를 사용하지 않습니다. 특히이 사람은 2 람다 걸립니다. 나는 빵을 자르기 위해 검을 사용하고있는 것처럼 들린다. 그러나 API가 그렇게하도록 강요한다면 나는 선택의 여지가 없다. – mathk