首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Dictionary<string、object>作为Dictionary<string、Dictionary<string、string>>

使用Dictionary<string、object>作为Dictionary<string、Dictionary<string、string>>
EN

Stack Overflow用户
提问于 2012-02-09 00:10:43
回答 7查看 37.4K关注 0票数 3

在C#中,我需要将数据保存在字典对象中,如下所示:

代码语言:javascript
复制
Dictionary<string, Dictionary<string, string>> MyDict = 
    new Dictionary<string, Dictionary<string, string>>();

现在我意识到,在某些情况下,我需要一些其他的(不像字典一样的)数据作为主字典的值。

如果我只引用主词,有没有什么问题或限制。作为:

代码语言:javascript
复制
Dictionary<string, object> MyDict = new Dictionary<string, object>();

在object字段中,我可以输入字符串、字典等..

提前谢谢,致以最好的问候,史蒂文

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-02-09 00:18:21

通过使用object作为字典中的值,您将招致一些风险和复杂性:

  • 缺乏类型安全性(任何内容都可以设置为值)
  • 您必须强制转换为特定类型,这可能基于值

你可能应该重新考虑你的设计。但是如果你真的想要更好的灵活性,你可以创建一个新的类型作为值类型。类似于:

代码语言:javascript
复制
class MySpecialType
{
    public Dictionary<string, string> MyStringDictionary { get; set; }
    public string MyStringVal {get; set;}

    public Type ActiveType { get; set; } // property would specify the current type
    // ...

然后,您的主字典声明将如下所示:

代码语言:javascript
复制
Dictionary<string, MySpecialType> MyDict = new Dictionary<string, MySpecialType>();

您可以使用ActiveType属性或创建一个指定类型的枚举。您还可以在类中使用静态util函数,它可以帮助您返回正确的实例和类型……

票数 3
EN

Stack Overflow用户

发布于 2012-02-09 00:13:36

是的,你的字典将不再是强类型的-在第一种方法中,你可以这样做:

代码语言:javascript
复制
string value = myDict["foo"]["bar"];

在第二种方法中,这是不可能的,因为您必须首先进行强制转换:

代码语言:javascript
复制
string value = ((Dictionary<string,string>)myDict["foo"])["bar"];

听起来你的问题可以用一个更好的设计方法来解决。通常,可以通过重新设计解决方案来避免在同一数据结构中存储不同类型的对象-那么为什么需要这样做呢?

编辑:

如果你只想处理null的值,你可以这样做:

代码语言:javascript
复制
string value = myDict["foo"] != null ? myDict["foo"]["bar"] : null;

或者封装在扩展方法中:

代码语言:javascript
复制
public static T GetValue<T>(this Dictionary<T, Dictionary<T,T>> dict, 
                            T key, T subKey) where T: class
{
    T value = dict[key] != null ? dict[key][subKey] : null;
    return value;
}

string value = myDict.GetValue("foo", "bar");
票数 5
EN

Stack Overflow用户

发布于 2012-02-09 00:19:09

你可以做到的。从主字典中检索数据后,您必须将结果转换为适当的类型:

代码语言:javascript
复制
object obj;
If(mainDict.TryGetValue("key", out obj)) {
    var dict = obj as Dictionary<string, string>>;
    if (dict != null) {
        // work with dict
    } else {
        var value = obj as MyOtherType;
        ....
    }
}

但请注意,这不是类型安全的;也就是说,编译器只能部分检查代码关于object类型的值的有效性。

或者,您可以尝试更面向对象的解决方案

代码语言:javascript
复制
public abstract class MyBaseClass 
{
    public abstract void DoSomething();
}

public class MyDictClass : MyBaseClass
{
    public readonly Dictionary<string, string> Dict = new Dictionary<string, string>();

    public override void DoSomething()
    {
        // So something with Dict
    }
}

public class MyTextClass : MyBaseClass
{
    public string Text { get; set; }

    public override void DoSomething()
    {
        // So something with Text
    }
}

然后使用以下命令声明您的主字典

代码语言:javascript
复制
var mainDict = new Dictionary<string, MyBaseClass>();

mainDict.Add("x", new MyDictClass());
mainDict.Add("y", new MyTextClass());

...

MyBaseClass result = mainDict[key];
result.DoSomething(); // Works for dict and text!
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9197084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档