如何实现通用字典类?

时间:2017-07-03 14:16:55

标签: c# generics

当我尝试运行以下代码时, foreach 语句在编译时抛出以下错误

  

无法将类型'string'转换为   'System.Collections.Generic.KeyValuePair>'

namespace myClass
{
public class myDictionary<T>
{
    Dictionary<string, List<T>> dictionary = new Dictionary<string, List<T>>();

    public void Add(string key, T value)
    {
        List<T> list;
        if (this.dictionary.TryGetValue(key, out list))
        {
            list.Add(value);
        }
        else
        {
            list = new List<T>();
            list.Add(value);
            this.dictionary[key] = list;
        }
    }

    public IEnumerable<string> Keys
    {
        get
        {
            return this.dictionary.Keys;
        }
    }

    public List<T> this[string key]
    {
        get
        {
            List<T> list;
            if (!this.dictionary.TryGetValue(key, out list))
            {
                list = new List<T>();
                this.dictionary[key] = list;
            }
            return list;
        }
    }

    public IEnumerator<T> GetEnumerator()
    {
        return (dictionary as IEnumerable<T>).GetEnumerator();

    }
}

class Program
{
    static void Main()
    {
        myDictionary<string> dictionary = new myDictionary<string>();

        dictionary.Add("One", "AA");
        dictionary.Add("One", "BB");
        dictionary.Add("Two", "CC");
        dictionary.Add("Two", "DD");


        foreach(KeyValuePair<string, List<string>> pair in dictionary)
        {

        }

    }
}

}

请让我知道我的实施有什么问题。谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

看起来问题是:

public IEnumerator<T> GetEnumerator()
{
    return (dictionary as IEnumerable<T>).GetEnumerator();
}

但是,您需要澄清此返回的内容,因为您的字典是列表之一。这是否意味着依次是所有列表中的所有值?如果是这样,我想:

public IEnumerator<T> GetEnumerator()
{
    return dictionary.Values.SelectMany(x => x).GetEnumerator();
}

但是,如果您想要返回对,那么:

public IEnumerator<KeyValuePair<string, List<T>>> GetEnumerator()
{
    return dictionary.GetEnumerator();
}