【问题标题】:How to model key-value pairs with nested collections in C#?如何在 C# 中使用嵌套集合对键值对进行建模?
【发布时间】:2013-03-18 20:39:58
【问题描述】:

我正在尝试用 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"
}

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

  • 1次初始化:一旦我创建了数据结构,我只需要读取它,所以一个不可变的结构就可以了。
  • 搜索是否存在键:我需要能够确定给定的键是否存在于数据中。有些键是众所周知的,有些是动态的,所以直到运行时我才会知道它们的所有名称,所以我必须使用字符串查找键。在上面的示例中,假设我提前知道 foobarbaz,但 quux 对我来说是新的,我不提前知道它是否存在,如果它存在,并且如果它将具有平面或嵌套值。
  • 获取键的“flat”值:值是truefalse 和一些“可能”的string 值用于“flat”成员。如有必要,我可以将其转换为真正的布尔值(将“可能”值视为true),但我更愿意保留“可能”值。我想我可以预先知道所有“可能”的值,所以我还可以构建一个 Enum 来保存这些值,并在其中抛出 truefalse,这样我就有了一个单一类型的值。
  • 获取嵌套数据的键和值:一些键的值本身就是键值对的集合。我需要能够区分这些成员,并搜索嵌套键及其值。根据我对输入数据的了解,我认为嵌套的深度不会超过 1 级。

由于键是独一无二的,我被字典所吸引,因为它具有查找速度和易用性。但是我有点难以理解将嵌套集合与平面值一起表示。这在 JavaScript 这样的动态语言中非常容易。 C#中对应的成语是什么?

【问题讨论】:

    标签: c# javascript dynamic data-structures


    【解决方案1】:

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

    【讨论】:

    • 嘿,在尝试了其他一些事情之后,我最终开始走这条路——我只是希望我能得到比 Object 更具描述性的值!
    • 您可以使用一个包装类(值)或一个接口和两个包装类(嵌套/平面)。在 JavaScript 中也有可能是动态的,即 var-keyword 和匿名对象可能会有所帮助,但它们不是很漂亮。
    猜你喜欢
    • 2011-08-14
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多