如何检测包含subDictionary的Dictionary?

时间:2010-01-04 01:41:01

标签: c# dictionary

我声明了一个像这样的静态mainDict,

private static Dictionary<string, object> mainDict = new Dictionary<string, object>();
Dictionary<string, object> aSubDict = new Dictionary<string,object>();
mainDict.Add("StringA0Key", "StringValue");
mainDict.Add("StringA1Key", aSubDict);

如何检测值类型是字符串(StringValue)还是字典(aSubDict)

我需要检测值类型并循环到“aSubDict”,否则我只需打印“StringValue”。谢谢。

[更新]

感谢您的帮助,我用下面的更新代码结束了我的问题。

using System;
using System.Collections;
using System.Collections.Generic;

class Program
{
    private static Dictionary<string, object> mainDict = new Dictionary<string, object>();

    public static void Main()
    {


        Dictionary<string, object> aSubDict = new Dictionary<string, object>();
        mainDict.Add("sA0Key", "sA0Value");
        mainDict.Add("sA1Key", aSubDict);         
        aSubDict.Add("sSubKey","sSubValue");

        foreach (string theKey in mainDict.Keys)
        {
            if (!ReferenceEquals(null, mainDict[theKey]) && (mainDict[theKey] is Dictionary<string, object>))
            {
                //Console.WriteLine("type of aSubDict");
                foreach (string subKey in aSubDict.Keys)
                {
                    if (!ReferenceEquals(null,aSubDict[subKey]) && aSubDict[subKey] is Dictionary<string, object>)
                    {    
                        Console.WriteLine("type of Child Dict");
                    }
                    else if (!ReferenceEquals(null, aSubDict[subKey]) && (aSubDict[subKey] is string))
                    {
                        Console.WriteLine("subKey = {0}, subValue = {1}", subKey, aSubDict[subKey]);
                    }
                }

            }
            else if (!ReferenceEquals(null, mainDict[theKey]) &&  (mainDict[theKey] is string))
            {
                // Console.WriteLine("type string");
                Console.WriteLine("Key = {0}, Value = {1}", theKey, mainDict[theKey]);
            }
        } 
    }
}

3 个答案:

答案 0 :(得分:4)

if (obj is IDictionary)

这是因为所有词典,即使是通用的,implement the IDictionary interface

还要注意NullReferenceException

if (!ReferenceEquals(null, obj) && obj is IDictionary)

<强>更新

您要测试is IDictionary<string, object>。可能子类字典因类型参数(如IDictionary<int,string>)或任意数量的键/值类型组合而不同 - 这意味着它与编译器的类型不同。但是,如果您想将其视为loosley类型的字典,那么只需测试is IDictionary并使用IDictionary members - 请注意这些成员采用对象引用。

Dictionary<string, int>Dictionary<int, object>的类型不同(它们永远不会是同一类型)。但是两者都是已实现的类型IDictionary - 这就是为什么IDictionary可能是您在这种情况下搜索的内容。

我已将代码的中间部分更新并修改为IDictionary,但我没有测试逻辑或尝试编译它...

using System.Collections;
using System.Collections.Generic;

...

if (!ReferenceEquals(null, kvp) && (kvp is IDictionary))
        {

            foreach (DictionaryEntry entry in aSubDict)
            {
                if (entry.Value is IDictionary)
                {
                    Console.WriteLine("iDictionary found");
                }
                else
                {
                    Console.WriteLine("SubKey = {0}, SubValue = {1}", entry.Key, entry.Value);
                }
            }

可能你需要修改逻辑,因为子字典在'parent'字典条目的.Key或.Value中,但这是一个开始。

答案 1 :(得分:2)

检查它是否实现了接口System.Collections.IDictionary

if (mainDict["StringA1Key"] is IDictionary)
{
}

答案 2 :(得分:1)

如果您的目标是检测mainDict 中给定字典KevValue对的 是否属于确切类型 < / strong> ofSubDict:ie:一个字典,其键是Type字符串,值是Type对象:

    Type testType = aSubDict.GetType();

    foreach (string theKey in mainDict.Keys)
    {
        if ((mainDict[theKey]).GetType() == testType)
        {
            Console.WriteLine("Match found");
        }
    }

如果您的目标是检测mainDict 中给定字典KevValue对的 是否为实例 aSubDict:

    foreach (string theKey in mainDict.Keys)
    {
        if (mainDict[theKey] == aSubDict)
        {
            Console.WriteLine("Match found");
        }
    }

让我们用一个完整的例子来解决这个问题,该例子过滤了'仅限类型且不使用GetType():

    foreach (string theKey in mainDict.Keys)
    {
        if(mainDict[theKey] is Dictionary<string, object>)
        {
            Console.WriteLine("type of aSubDict");

        } else if (mainDict[theKey] is string)
        {
            Console.WriteLine("type string");
        }
    }

以上针对FrameWork 3.5编译的Visual Studio Beta 2010 beta 2中测试的所有代码(不是“客户端模式”3.5,完整的monte)。