加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为从Dictionary派生的类启用foreach

发布时间:2020-12-15 19:48:50 所属栏目:百科 来源:网络整理
导读:我有一个派生自Dictionary的类.我需要这个类来模拟HashSet,因为Silverlight不知道HashSets,而且我的类大量使用HashSet.所以我决定用字典交换HashSet.为了进一步将我的类与所有HashSet-Objects一起使用,我尝试创建一个自定义的HashSet类,它派生自Dictionary并
我有一个派生自Dictionary的类.我需要这个类来模拟HashSet,因为Silverlight不知道HashSets,而且我的类大量使用HashSet.所以我决定用字典交换HashSet.为了进一步将我的类与所有HashSet-Objects一起使用,我尝试创建一个自定义的HashSet类,它派生自Dictionary并覆盖所有相关方法,如Add-method:

class HashSet<T> : Dictionary<T,object>
{

    public override void Add(T element)
    {
        base.Add(element,null);
    }
}

现在我需要为我的新HashSet类启用foreach-loop.显然,我的类在foreach循环中返回一个KeyValuePair,但我需要T作为返回类型.谁能告诉我,我需要覆盖Dictionary基类的内容和方式?

提前致谢,
坦率

解决方法

我强烈建议你不要首先从Dictionary中派生出来.使用组合而不是继承.如果从派生词派生,人们可以将您的类用作键/值对的字典而不是集合.

所以,你用它里面的字典来设计你的类:

public sealed class DictionaryBackedSet<T> : IEnumerable<T>
{
    private readonly Dictionary<T,int> dictionary = new Dictionary<T,int>();

    public IEnumerator<T> GetEnumerator()
    {
        return dictionary.Keys.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    public bool Add(T item)
    {
        if (Contains(item))
        {
            return false;
        }
        dictionary.Add(item,0);
        return true;
    }

    public bool Contains(T item)
    {
        return dictionary.ContainsKey(item);
    }

    // etc
}

您可能还想创建一个空结构作为字典的值类型参数:

public struct Empty {}

这可能会节省一点内存.我现在不担心它 – 如果你编写字典而不是继承它,那么以后做出改变不会破坏任何东西:)

如果您可以为此目的使用System.Void(即使用Dictionary< T,Void>),那将是很好的,但C#不会让你这样做:(

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读