C#从Dictionary继承,遍历KeyValuePairs
我有一个继承自Dictionary<string, string>
。 在一个实例方法中,我想遍历所有KeyValuePair<string, string>
的。 我尝试了以下操作:
foreach (KeyValuePair<string, string> pair in base)
但是这会失败,并出现以下错误:
关键词'base'的使用在此上下文中无效
我怎样才能迭代在从Dictionary<string, string>
派生类的实例方法中的KeyValuePair<string, string>
Dictionary<string, string>
?
编辑:我发现我可以做到以下几点:
var enumerator = base.GetEnumerator();
while (enumerator.MoveNext())
{
KeyValuePair<string, string> pair = enumerator.Current;
}
不过,我仍然想知道是否有办法通过foreach
循环来完成此操作。
编辑:谢谢关于不从Dictionary<string, string>
继承的建议。 相反System.Collections.IEnumerable, ICollection<KeyValuePair<string, string>>, IEnumerable<KeyValuePair<string, string>>, IDictionary<string, string>
我实现了System.Collections.IEnumerable, ICollection<KeyValuePair<string, string>>, IEnumerable<KeyValuePair<string, string>>, IDictionary<string, string>
。
首先,从.NET集合类派生通常是不明智的,因为它们不提供不是从object
继承的调用的虚拟方法。 当通过基础类引用传递派生集合时,这可能会导致错误。 你最好实现IDictionary<T,TKey>
接口,并在你的实现中聚合一个Dictionary<,>
,然后转发给你相应的调用。
除此之外,在你的具体情况下,你想要做的是:
foreach( KeyValuePair<string,string> pair in this ) { /* code here */ }
base
关键字主要用于访问基类的特定成员。 这不是你在这里做的 - 你正试图迭代一个特定实例的项目......这只是this
参考。
我同意JaredPar的评论,认为这不是一个好主意。 你可能不希望公开所有Dictionary的方法到外部世界,所以只要将Dictionary设为一个私有成员变量,然后给它提供你自己的接口。
这样说,做你想做的事情的方式是:
foreach (KeyValuePair<string, string> pair in this)
将Dictionary<string, string>
封装为自定义class MyDictionary
的组合字段,并为class MyDictionary
实现自定义IEnumerable和IEnumerator(或其变体)(或创建实现方便的C# yield
关键字以生成项目的方法)...
例如
class MyDictionary : IEnumerable<KeyValuePair<string,string>> {
Dictionary<string, string> _dict;
IEnumerator<KeyValuePair<string,string>> GetEnumerator() {
return new MyEnum(this); // use your enumerator
// OR simply forget your own implementation and
return _dict.GetEnumerator();
}
class MyEnum : IEnumerator<KeyValuePair<string,string>> {
internal MyEnum(MyDictionary dict) {
//... dict
}
// implemented methods (.MoveNext, .Reset, .Current)...
这保持了无关方法的封装。 而且你仍然可以从内部或外部迭代你的实例:
// from outside
MyDictionary mdict = new MyDictionary();
foreach (KeyValuePair<string, string> kvp in mdict)
//...
// from inside, assuming: this == MyDictionary instance)
public void MyDictionaryMethod() {
foreach (KeyValuePair<string, string> kvp in this)
//...
链接地址: http://www.djcxy.com/p/53873.html