如何在c#中使用嵌套集合对键值对建模

本文关键字:集合 嵌套 键值对 建模 | 更新日期: 2023-09-27 18:04:45

我试图在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"
}

我想用以下方式处理数据:

  • 一次性初始化:一旦我创建了数据结构,我只需要读取它,所以一个不可变的结构是好的。
  • 搜索键的存在:我需要能够确定是否给定的键存在于数据中。有些键是已知的,有些键是动态的,所以直到运行时我才会知道它们的所有名称,所以我必须使用字符串来查找键。在上面的例子中,假设我提前知道foo, barbaz,但quux对我来说是新的,我不知道它是否存在,如果它存在,以及它是否会有一个平坦或嵌套的值。
  • 获取键的'flat'值:值为'flat'成员的true, false和一些'maybe' string值。如果有必要,我可以将其转换为实际的布尔值(将"maybe"值视为true),但我更愿意保留"maybe"值。我想我可以知道所有的"可能"值在前面,所以我也可以建立一个Enum持有这些值,并抛出truefalse在那里,所以我有一个单一类型的值。
  • 获取嵌套数据的键和值:一些键的值本身就是键值对的集合。我需要能够区分这些成员,并搜索嵌套的键及其值。从我所看到的输入数据来看,我认为嵌套不会超过1级。

因为键是唯一的,我被字典所吸引,因为它的查找速度和易用性。但我有点难倒在表示嵌套集合与平面值。这在像JavaScript这样的动态语言中非常容易;c#中对应的习语是什么?

如何在c#中使用嵌套集合对键值对建模

c#中真正对应的结构应该是一个匿名对象/类。我个人更喜欢使用Dictionary,要么使用object作为值类型(然后,检查键的值是否为另一个Dictionary,这样你就知道你是否有一个嵌套集合),要么使用包装类,它保存一个Dictionary或一个平面值,并有一些字段,如IsNestedCollection和任何你需要的。