gpt4 book ai didi

C# 覆盖方法

转载 作者:行者123 更新时间:2023-11-30 16:12:10 25 4
gpt4 key购买 nike

我需要有关覆盖方法的帮助 IEnumerator<T> .我想要一个字典类,在枚举期间将只返回元素,如 dictionary.Values。它在 foreach 中工作,我建议因为 foreach 使用 IEnumerator而不是 IEnumerator<T> ,但 LINQ 方法不适用于我的类的实例。如果我尝试调用 linq 方法,我会得到 Could not find an implementation of the query pattern for source type。找不到“哪里”。

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

关于C# 覆盖方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23328382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com