在序列化字典上使用foreach语句

时间:2011-11-29 16:54:10

标签: c# wcf dictionary ienumerable

我有一个我为WCF REST Web服务创建的可序列化字典

[Serializable]
public class jsonDictionary<TKey, TValue> : ISerializable
{
    private Dictionary<TKey, TValue> _Dictionary;
    public jsonDictionary()
    {
        _Dictionary = new Dictionary<TKey, TValue>();
    }
    public jsonDictionary(SerializationInfo info, StreamingContext context)
    {
        _Dictionary = new Dictionary<TKey, TValue>();
    }
    public TValue this[TKey key]
    {
        get { return _Dictionary[key]; }
        set { _Dictionary[key] = value; }
    }
    public void Add(TKey key, TValue value)
    {
        _Dictionary.Add(key, value);
    }
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        foreach (TKey key in _Dictionary.Keys)
            info.AddValue(key.ToString(), _Dictionary[key]);
    }
}

我需要搜索这个词典来确定是否存在几个可能的键中的一个。我想我会使用类似的foreach语句来做到这一点

foreach(var pair in dictionary)
{
    switch(pair.key)
    {
        case "something":

        Break;
        case "somethingelse":
        Break;
     }
}

但是我一直收到错误:

    foreach statement cannot operate on variables of type 'ZTERest.jsonDictionary<string,string>' because 'ZTERest.jsonDictionary<string,string>' does not contain a public definition for 'GetEnumerator'

我知道我必须对IEnumerable或IEnumerator接口做一些事情,但我不确定如何。

3 个答案:

答案 0 :(得分:1)

你的类需要实现IEnumerable来对字典的Key执行foreach,因此你的类看起来如下所示

public class jsonDictionary<TKey, TValue> : ISerializable, IEnumerable<TKey>

然后,您需要从IEnumerable接口实现以下方法,如下所示:

public IEnumerator<TKey> GetEnumerator()
{
    // Since we want to iterate on the Key we specifiying the enumerator on keys
    return _Dictionary.Keys.GetEnumerator();
}

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

然后,当您执行foreach时,将获取字典中的键,因此您可以按照所示使用foreach:

foreach(var key in dictionary)
{
    switch(key)
    {
         case "Something":
             // do something
             break;
         case "SomethingElse":
             //do something
             break;
    }
}

答案 1 :(得分:1)

字典提供了一个键/值查找的原因,它不是你经常迭代的东西。您的类正在包装的通用Dictionary<>对象已经有一个名为ContainsKey()的方法,它将完全按照您要查找的内容进行操作,而无需通过每个键/值对来查看它是否为那里。没有必要公开迭代器,只需将它添加到您的类中。

public bool ContainsKey(TKey key)
{
    return _Dictionary.ContainsKey(key);
}

并称之为。

if (dictionary.ContainsKey("Something"))
{
    //do something
}

答案 2 :(得分:1)

如果您确实需要遍历字典(而不仅仅是检查某个密钥是否存在),Dictionary.Keys属性将返回一个可枚举的集合,您可以使用迭代遍历字典:

foreach(var key in dictionary.Keys)
{
    if(dictionary[key] == "something")
    {
        // Do something
    }
}