我正在尝试找出表示某些数据的最佳方法。它基本上遵循以下形式:Manufacturer.Product.Attribute = Value。就像是:

Acme。*。MinimumPrice = 100
Acme.ProductA.MinimumPrice = 50
Acme.ProductB.MinimumPrice = 60
Acme.ProductC.DefaultColor =蓝色

因此,除产品A和B之外,所有Acme产品的最低价格为100。我想将此数据存储在C#中,并具有一些函数,其中GetValue(“ Acme.ProductC.MinimumPrice”)返回100,但GetValue(“ Acme .ProductA.MinimumPrice“)返回50。

我不确定如何最好地表示数据。有没有一种干净的方法来用C#编写代码?

编辑:我可能还不清楚。这是配置数据,需要将其存储在文本文件中,然后以某种方式解析并存储在内存中,以便可以像我给出的示例一样对其进行检索。

最佳答案

完全像这样编写文本文件:

Acme.*.MinimumPrice = 100
Acme.ProductA.MinimumPrice = 50
Acme.ProductB.MinimumPrice = 60
Acme.ProductC.DefaultColor = Blue


将其解析为路径/值对序列:

foreach (var pair in File.ReadAllLines(configFileName)
                         .Select(l => l.Split('='))
                         .Select(a => new { Path = a[0], Value = a[1] }))
{
    // do something with each pair.Path and pair.Value
}


现在,对您要做什么有两种可能的解释。字符串Acme.*.MinimumPrice意味着对于没有特定替代的任何查找(例如Acme.Toadstool.MinimumPrice),即使文件中的任何地方都没有引用100的内容,我们都将返回Toadstool。否则可能意味着,如果文件中还有其他关于100的特定提及,则仅应返回Toadstool

如果是前者,则可以将全部存储在一个平面字典中,并且在查找时间继续尝试键的不同变体,直到找到匹配的东西。

如果是后者,则需要构建一个实际包含在路径结构中的所有名称的数据结构,以避免为实际上不存在的名称返回值。这对我来说似乎更可靠。

因此,对于后一个选项,Acme.*.MinimumPrice的意思是说“将这个MinimumPrice值添加到没有自己专门定义的值的任何产品中”。这意味着您基本上可以在解析时处理对,以消除所有星号,并将其扩展为与配置文件的完整版本等效:

Acme.ProductA.MinimumPrice = 50
Acme.ProductB.MinimumPrice = 60
Acme.ProductC.DefaultColor = Blue
Acme.ProductC.MinimumPrice = 100


这样做的好处是,您只需要一个平面字典作为最终表示形式,就可以使用TryGetValue[]进行查找。结果可能要大得多,但这全取决于配置文件的大小。

您可以将信息的存储量降到最低,但是我会从一些简单的东西入手,并为其提供一个非常简单的API,以便以后在确实需要时可以重新实现它。您可能会发现(取决于应用程序)使查找过程变得更加复杂总体上来说更糟。

关于c# - 这更适合于键值存储或树吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2467908/

10-10 03:50