2013-03-18 106 views
0

我想在C#中构建一个数据结构来保存在JavaScript中创建的动态数据,并用JSON表示。我正在寻找关于如何设计C#数据结构来容纳JSON数据的方法,以便于搜索。我目前使用.NET 4.0; 4.5对于这个特定的项目是一种解决方法。如何在C#中使用嵌套集合建模键值对?

数据具有以下性质:

  • 键 - 值对的集合
  • 键唯一
  • 的值可以是任意的truefalse, 一些字符串值,或键值对的嵌套集合
  • 几十个顶级属性,并且具有嵌套集合的属性在集合中具有六个对

这里的JavaScript的数据的一个例子:

{ 
    foo: true, 
    bar: false, 
    baz: { 
     a: true, 
     b: false, 
     c: "maybe" 
    } 
    quux: "maybe" 
} 

我想通过以下方式与数据的工作:一旦我创建数据:

  • 1时初始化结构,我只需要读它,所以一个不可变的结构是好的。
  • 搜索密钥的存在:我需要能够确定给定的密钥是否存在于数据中。一些键是众所周知的,而另一些键是动态的,所以我不会在运行时知道他们的所有名字,所以我必须使用字符串来查找键。在上面的示例中,假设我事先知道foobarbaz,但quux对我来说是新的,我不知道它是否存在,如果存在,以及它是否有平面或嵌套值。
  • 获取“平坦”值用于一个键:值是truefalse和许多用于“平坦”的成员“也许” string值。如果有必要,我可以将其转换为真正的布尔值(将“可能”值视为true),但我更愿意保留“可能”值。我想我可以预先知道所有'可能'的值,所以我也可以建立一个包含这些值的Enum,并且还将truefalse放在那里,所以我有一个类型的值。
  • 获取嵌套数据的键和值:某些键的值本身就是键值对的集合。我需要能够区分这些成员,并搜索嵌套的键和它们的值。根据我所看到的输入数据,我认为嵌套不会超过1级。

由于密钥是唯一的,所以我被查找速度和易用性的词典吸引。但我有点难以表达嵌套集合和平坦值。在JavaScript这样的动态语言中这是非常容易的; C#中相应的成语是什么?

回答

0

C#中真正的对应结构将是一个匿名对象/类。 我个人更喜欢使用Dictionary,或者将它与对象作为值类型一起使用(然后,检查一个键的值是否是另一个Dictionary,以便知道是否有嵌套集合)或使用包装类,它包含一个Dictionary或一个平坦的值,并且有一些像IsNestedCollection这样的字段和任何你需要的东西。

+0

呵呵,在尝试了其他一些事情之后,我终于开始了这条道路 - 我只是希望能够为Object值得到比Object更具描述性的东西! – Val 2013-03-18 20:54:39

+0

你可以使用一个包装类(值)或一个接口和两个包装类(嵌套/平面)。在JavaScript中有可能是动态的,即var-keyword和匿名对象可能会有所帮助,但它们不是很漂亮。 – 2013-03-18 21:05:40