C#重写方法

时间:2014-04-27 20:08:19

标签: c#

我需要帮助覆盖方法IEnumerator<T>。我希望有一个字典类,在枚举期间只返回元素,如dictionary.Values。它在foreach中工作,我建议因为foreach使用IEnumerator而不是IEnumerator<T>,但LINQ方法不适用于我的类的实例。如果我尝试调用linq方法,我得到无法找到源类型的查询模式的实现。 '哪里'找不到。

public abstract class SpecialDictionary : Dictionary<TKey, MyClass>, IEnumerable<MyClass>
{
    public Add(MaClass item)
    {
        Add(item.Id, item); 
    }

    new public IEnumerator<MyClass> GetEnumerator()
    {
        return this.Values.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

我需要通过id快速访问元素的项目集合。所有元素都有Guid id。这对我来说似乎是一个好主意,但我欢迎您对此解决方案的建议。

1 个答案:

答案 0 :(得分:3)

问题是SpecialDictionary现在同时实现了IEnumerable<KeyValuePair<Guid,MyClass>>IEnumerable<MyClass>。由于这种模糊性,LINQ无法在这两个选项之间进行选择,也没有选择。扩展方法仍然有效,但需要显式类型参数:

MyClass item = dict.First<MyClass>();

同样地:

KeyValuePair<Guid, MyClass> pair = dict.First<KeyValuePair<Guid, MyClass>>();
但是,LINQ不允许您添加显式类型参数,因此不起作用。我的建议是:不要这样做。如果用户想要处理这些值,请让他们通过.Values进行操作。


这是封装的一个例子:

public class SpecialDictionary : IEnumerable<MyClass>
{
    private readonly Dictionary<Guid, MyClass> inner = new Dictionary<Guid, MyClass>();
    public void Add(MyClass item)
    {
        inner.Add(item.Id, item);
    }

    public MyClass this[Guid id]
    {
        get { return inner[id]; }
        set { inner[id] = value; }
    }
    public bool TryGetValue(Guid id, out MyClass value)
    {
        return inner.TryGetValue(id, out value);
    }
    public IEnumerator<MyClass> GetEnumerator()
    {
        return inner.Values.GetEnumerator();
    }
    public int Count { get { return inner.Count; } }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}