2016-07-20 19 views
2

Über Bidirection Wörterbuch: Bidirectional 1 to 1 Dictionary in C#Verwenden Auflistungsinitialisierer für Bidirection Wörterbuch

Mein bi-Wörterbuch ist:

internal class BiDirectionContainer<T1, T2> 
    { 
     private readonly Dictionary<T1, T2> _forward = new Dictionary<T1, T2>(); 
     private readonly Dictionary<T2, T1> _reverse = new Dictionary<T2, T1>(); 

     internal T2 this[T1 key] => _forward[key]; 

     internal T1 this[T2 key] => _reverse[key]; 

     internal void Add(T1 element1, T2 element2) 
     { 
      _forward.Add(element1, element2); 
      _reverse.Add(element2, element1); 
     } 
    } 

Ich möchte wie diese Elemente hinzuzufügen:

BiDirectionContainer<string, int> container = new BiDirectionContainer<string, int> 
{ 
    {"111", 1}, 
    {"222", 2}, 
    {"333", 3},  
} 

aber im nicht sicher, wenn es richtig ist, IEnumerable in BiDirectionContainer zu verwenden? Was sollte ich zurückgeben, wenn ja? Gibt es eine andere Möglichkeit, diese Funktionalität zu implementieren?

+0

@Dirk Vollmar alles, was ich brauche, ist eine einfache Initialisierung. Ich plane nicht, es in foreach Statements zu verwenden. Aber ich fürchte, dass meine Klasse andere Leute verwirren kann, die sie benutzen können. –

Antwort

2

Am einfachsten ist es wahrscheinlich die Elemente der vorderen aufzuzählen (oder rückwärts, was natürlicher scheint) Wörterbuch wie folgt:

internal class BiDirectionContainer<T1, T2> : IEnumerable<KeyValuePair<T1, T2>> 
{ 
    private readonly Dictionary<T1, T2> _forward = new Dictionary<T1, T2>(); 
    private readonly Dictionary<T2, T1> _reverse = new Dictionary<T2, T1>(); 

    internal T2 this[T1 key] => _forward[key]; 

    internal T1 this[T2 key] => _reverse[key]; 

    IEnumerator<KeyValuePair<T1, T2>> IEnumerable<KeyValuePair<T1, T2>>.GetEnumerator() 
    { 
     return _forward.GetEnumerator(); 
    } 

    public IEnumerator GetEnumerator() 
    { 
     return _forward.GetEnumerator(); 
    } 

    internal void Add(T1 element1, T2 element2) 
    { 
     _forward.Add(element1, element2); 
     _reverse.Add(element2, element1); 
    } 
} 

Als beiseite: Wenn Sie nur in der Lage sein Auflistungsinitialisierer zu verwenden Gemäß der C# -Sprachenspezifikation implementiert Ihre Klasse System.Collections.IEnumerableund stellt auch eine Add-Methode bereit, die für jeden Elementinitialisierer anwendbar ist (dh grundsätzlich müssen Anzahl und Art der Argumente übereinstimmen). Die Schnittstelle wird vom Compiler benötigt, aber die Methode GetEnumerator wird nicht aufgerufen, wenn die Auflistung initialisiert wird (nur die Methode add). Dies ist erforderlich, da der Auflistungsinitialisierer nur für Objekte verfügbar sein sollte, die tatsächlich eine Auflistung sind, und nicht nur für Objekte, die über eine add-Methode verfügen. Therefore it is fine nur die Schnittstelle hinzufügen, ohne tatsächlich eine Methode Körper implementieren (public IEnumerator GetEnumerator(){ throw new NotImplementedException(); })