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

上一篇: C# inherit from Dictionary, iterate over KeyValuePairs

下一篇: Inheriting from List<T> in .NET (vb or C#)