在C#中,我需要将数据保存在字典对象中,如下所示:
Dictionary<string, Dictionary<string, string>> MyDict =
new Dictionary<string, Dictionary<string, string>>();现在我意识到,在某些情况下,我需要一些其他的(不像字典一样的)数据作为主字典的值。
如果我只引用主词,有没有什么问题或限制。作为:
Dictionary<string, object> MyDict = new Dictionary<string, object>();在object字段中,我可以输入字符串、字典等..
提前谢谢,致以最好的问候,史蒂文
发布于 2012-02-09 00:18:21
通过使用object作为字典中的值,您将招致一些风险和复杂性:
你可能应该重新考虑你的设计。但是如果你真的想要更好的灵活性,你可以创建一个新的类型作为值类型。类似于:
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
// ...然后,您的主字典声明将如下所示:
Dictionary<string, MySpecialType> MyDict = new Dictionary<string, MySpecialType>();您可以使用ActiveType属性或创建一个指定类型的枚举。您还可以在类中使用静态util函数,它可以帮助您返回正确的实例和类型……
发布于 2012-02-09 00:13:36
是的,你的字典将不再是强类型的-在第一种方法中,你可以这样做:
string value = myDict["foo"]["bar"];在第二种方法中,这是不可能的,因为您必须首先进行强制转换:
string value = ((Dictionary<string,string>)myDict["foo"])["bar"];听起来你的问题可以用一个更好的设计方法来解决。通常,可以通过重新设计解决方案来避免在同一数据结构中存储不同类型的对象-那么为什么需要这样做呢?
编辑:
如果你只想处理null的值,你可以这样做:
string value = myDict["foo"] != null ? myDict["foo"]["bar"] : null;或者封装在扩展方法中:
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");发布于 2012-02-09 00:19:09
你可以做到的。从主字典中检索数据后,您必须将结果转换为适当的类型:
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类型的值的有效性。
或者,您可以尝试更面向对象的解决方案
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
}
}然后使用以下命令声明您的主字典
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!https://stackoverflow.com/questions/9197084
复制相似问题