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。这对我来说似乎是个好主意,但我欢迎你对这个解决方案的建议。
问题是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();
}
}