C#重写方法

本文关键字:方法 重写 | 更新日期: 2023-09-27 18:00:21

我需要有关重写方法IEnumerator<T>的帮助。我想要一个dictionary类,它在枚举过程中只返回元素,比如dictionary。价值观它在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。这对我来说似乎是个好主意,但我欢迎你对这个解决方案的建议。

C#重写方法

问题是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();
    }
}