如何使用C#中的嵌套集合为键值对建模?

时间:2013-03-18 20:39:59

标签: c# javascript dynamic data-structures

我正在尝试在C#中构建一个数据结构来保存用JavaScript创建的动态数据并用JSON表示。我正在寻找有关如何设计C#数据结构的建议,以便以易于搜索的方式保存JSON数据。我目前正在使用.NET 4.0; 4.5是这个特定项目的一个方法。

数据具有以下属性:

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

以下是JavaScript数据的示例:

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

我想通过以下方式处理数据:

  • 一次性初始化:一旦我创建了数据结构,我只需要阅读它,所以一个不可变的结构就可以了。
  • 搜索密钥的存在:我需要能够确定数据中是否存在给定密钥。有些键是众所周知的,有些是动态的,所以在运行之前我不会知道它们的所有名称,所以我必须使用字符串来查找键。在上面的excample,假设我提前知道的关于时间foobarbaz,{但{1}}是新的给我,我不知道前面的时间如果它存在,它是否存在,以及它是否具有平坦或嵌套值。
  • 获取密钥的“固定”值:值为quuxtrue以及'flat'的多个'可能'false值成员。如果有必要,我可以将其转换为实际布尔值(将'可能'值视为string),但我更愿意保留'可能'值。我想我可以预先知道所有'可能'的值,所以我也可以构建一个true来保存这些值,并且还在那里抛出Enumtrue所以我有一个输入值。
  • 获取嵌套数据的键和值:某些键的值本身就是键值对的集合。我需要能够区分这些成员,并搜索嵌套键及其值。从我所看到的输入数据来看,我认为嵌套不会超过1级。

由于键是唯一的,我被词典所吸引,以提高查找速度和易用性。但我有点难以将嵌套集合与平值一起表示。这在像JavaScript这样的动态语言中非常简单;什么是C#中相应的成语?

1 个答案:

答案 0 :(得分:0)

C#中真正的对应结构将是一个匿名对象/类。 我个人更喜欢使用Dictionary,要么使用对象作为值类型(然后,检查键的值是否是另一个词典,所以你知道你是否有嵌套的集合)或使用包装类,持有字典或平面值,并有一些像IsNestedCollection和你需要的字段。