使用BiDirection字典的集合初始值设定项

时间:2016-07-20 13:18:25

标签: c# dictionary ienumerable bidirectional

关于BiDirection字典:Bidirectional 1 to 1 Dictionary in C#

我的双语词典是:

    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},    
}

但我不确定在IEnumerable中使用BiDirectionContainer是否正确? 如果是这样我该怎么回事?有没有其他方法可以实现这样的功能?

1 个答案:

答案 0 :(得分: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 并且也提供{{1适用于每个元素初始值设定项的方法(即基本数量和参数类型必须匹配)。编译器需要该接口,但在初始化集合时不调用Add方法(仅限add方法)。这是必需的,因为集合初始值设定项应仅适用于实际上是集合的内容,而不仅仅是具有add方法的内容。 Therefore it is fine只是添加界面而不实际实现方法体(GetEnumerator