5

내가 수집/시퀀스의 모든 유형을 잡고 IDictionary<K, S<V>>으로 변환됩니다 확장 방법을 쓰기 위해 노력하고있어 (S<V>) 더 적절한 데이터 구조 인 ILookup<K, V>에 그 사건들. 이상적으로, 내가 별도 쓰고 싶지 않아 등단일 확장 메서드 <K, IEnumerable을 /은 IList/ICollection에 <V>>

  • IDictionary<K, IEnumerable<V>>
  • IDictionary<K, List<V>>

  • IDictionary<K, ICollection<V>>
  • : 이것은 내가 다른 S 유형과 인터페이스에서 작동하는 확장 기능을하고 싶습니다 의미 가능한 각각의 콜렉션 유형에 대한 구현 및 유형 유추가 그 작업을 수행하기를 원합니다.

    내가 시도한 것은 :

    public static ILookup<TKey, TValue>ToLookup<TKey, TCollection, TValue>(
        this IDictionary<TKey, TCollection> dictionary) 
         where TCollection : IEnumerable<TValue> 
    

    그러나이 매개 변수 목록에 TValue이 없기 때문에 추론을 입력하면 알아낼 수없는 - 나는 방법 ToLookup의 형태 인수를 추론 할 수 없다 "GET 사용법 ".

    가짜 TValue 형식화 된 매개 변수를 메서드에 추가하는 것보다 다른 방법으로 작동 할 가능성이 있습니까? 예상 사용량

    예를 들면 내가 무엇보다도 희망

    이 가능하고 내 하나의 확장 메서드를 호출 결과 호출 : 나는 짓을했는지 테스트의 비트에서

    var dictOfIEnumerables = new Dictionary<int, IEnumerable<int>>(); 
    var lookupFromIEnumerables = dictOfIEnumerables.ToLookup(); 
    
    var dictOfICollections = new Dictionary<int, ICollection<int>>(); 
    var lookupFromICollections = dictOfICollections.ToLookup(); 
    
    var dictOfLists = new Dictionary<int, List<int>>(); 
    var lookupFromLists = dictOfLists.ToLookup(); 
    
    +0

    제발 사용할 때 – Mgetz

    +0

    일반을 위해 명시 적으로 유형을 지정하십시오. @Mgetz - NotherDev가 형식을 명시 적으로 지정하거나 가짜 인수를 사용하여 형식을 지정하지 않는 것입니다. 예상되는 사용법의 샘플은 아마도 일을 정리할 것입니다. –

    +0

    예, 앞서 언급 한 것처럼 유형 추론을 통해 작업을 수행하고 싶습니다. 예상되는 사용 예제를 질문에 추가합니다. – NOtherDev

    답변

    1

    모든 컬렉션은 IEnumerable<T>을 구현하므로 TCollection 형식 매개 변수 대신 사용할 수 있습니다. 불행히도 형식 유추는 이것을 모릅니다.이것은 내가 쓴 코드 :

    public static ILookup<TKey, TValue> ToLookup<TKey, TValue> 
         (this IDictionary<TKey, IEnumerable<TValue>> dict) 
    { 
        return dict.SelectMany(p => p.Value.Select 
         (v => new KeyValuePair<TKey, TValue>(p.Key, v))) 
         .ToLookup(p => p.Key, p => p.Value); 
    } 
    

    는 형식 유추 작업을 만드는 방법은없는 것 같다,하지만 당신은 사전 캐스트 경우이 방법은 작동합니다 : 또한 당신은 목록을 추가 할 수 있습니다

    ((IDictionary<int, IEnumerable<int>>)dictOfLists).ToLookup() 
    

    을 IEnumerables 사전에 추가하고 필요할 때 다시 캐스팅하십시오.

    0

    을, 여기 내 결과가 있습니다.

    dictOfIEnumerables.ToLookup(을 입력하면 오버로드 된 4 가지 방법이 표시됩니다.
    enter image description here

    그러나 dictOfIEnumerables.ToLookup<을 입력하면 5 가지 오버로드 된 메소드가 모두 표시됩니다. enter image description here

    IEnumerable에 정의 된 ToLookup() 간의 이름 충돌/해결 충돌로 인해 형식 유추가 작동하지 않는 것처럼 보입니다. 분명히 꺽쇠 괄호없이 IEnumerable에 정의 된 메서드로 해결됩니다. TCollection이 제한되어 있기 때문입니다. 어쩌면 StackOverflow에있는 누군가가 왜 똑같은 방식으로 작동하는지 설명 할 수 있습니다.

    그러나 실제로 지정된 유형을 사용하면 내 컴퓨터에서 올바르게 작동합니다. enter image description here

    +0

    글쎄, 실제로 문제는 이름 충돌 때문이 아니라 문제가 'ToLookup2'와 함께 계속됩니다. 내가 명시 적으로 인수를 지정할 수 있다는 것을 알고 있지만, 그것이 내가 피하려고하는 것입니다. 그것은 각 인터페이스에 대한 메서드를 복제와 함께 갈 필요가 보인다 ... – NOtherDev

    관련 문제