我正在尝试找出表示某些数据的最佳方法。它基本上遵循以下形式: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/