2016-07-20 31 views
2

关于双向词典使用集合初始化为双向词典

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); 
     } 
    } 

我想补充的元素是这样的:

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

但林不知道如果在BiDirectionContainer中正确使用IEnumerable? 如果是这样,我应该返回什么?有没有其他的方法来实现这样的功能?

+0

@Dirk Vollmar我所需要的只是简单的初始化。我不打算在每个表单中使用它。但是我担心我的班级会混淆可以使用它的其他人。 –

回答

2

最简单的可能是枚举前的元素(或向后,无论看起来更自然)字典,像这样:

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); 
    } 
} 

顺便说一句:如果你只是希望能够用集合初始化,C#语言规范要求您的类实现System.Collections.IEnumerable还提供了适用于每个元素初始值设定项(即参数的基本数目和类型必须匹配)的Add方法。编译器需要该接口,但在初始化集合(仅限add方法)时不会调用GetEnumerator方法。这是必需的,因为集合初始化器应该只适用于实际上是集合的事物,而不仅仅是具有添加方法的东西。 Therefore it is fine只是添加接口,而没有实际实现方法体(public IEnumerator GetEnumerator(){ throw new NotImplementedException(); }