我需要在 C# 中表示一个查找表,这是基本结构:
Name Range Multiplier
Active 10-20 0.5
你们有什么建议?
我将需要查找范围并检索乘数。我还需要使用名称进行查找。
更新 它总共可能有 10-15 行。范围是整数日期类型。
我需要在 C# 中表示一个查找表,这是基本结构:
Name Range Multiplier
Active 10-20 0.5
你们有什么建议?
我将需要查找范围并检索乘数。我还需要使用名称进行查找。
更新 它总共可能有 10-15 行。范围是整数日期类型。
您实际拥有的是两个查找表:一个按名称,一个按范围。根据表的大小,有几种方法可以在内存中表示它们。
最可能适合“按名称”查找的是字典:
var MultiplierByName = new Dictionary<string, double>() { {"Active",.5}, {"Other", 1.0} };
范围更棘手。为此,您可能只想存储最小或最大项目,具体取决于您的范围的工作方式。您可能还需要编写一个函数来将任何给定的整数归约为其对应的存储键值(提示:使用整数除法或 mod 运算符)。
从那里您 Dictionary<int, double>
可以选择另一个字典(List<double>
但就像我说的:要确定什么是最好的,我们真的需要知道查找中数据的范围和性质,以及您将用来访问它的场景。
创建一个类来表示每一行。它将具有 Name、RangeLow、RangeHigh 和 Multiplier 属性。创建此类行的列表(从文件中读取或在代码中输入),然后使用 LINQ 对其进行查询:
from r in LookupTable
where r.RangeLow <= x && r.RangeHigh >= x
select r.Multiplier;
有时简单是最好的。我们正在查看多少个条目,以及您在示例中似乎暗示的范围整数范围?虽然我能想到几种方法,但首先想到的是维护两个不同的查找字典,一个用于名称,一个用于值(范围),然后将冗余信息存储在范围字典中。当然,如果你的范围是双打键,或者你的范围达到数万,我会在我的书中寻找一些不同的东西,但简单的规则。
我将使用 DataTable 来实现这一点,假设没有迫切的理由使用另一种数据类型。DataTable.Select 适用于在名称或范围上运行查找。为此,您使用 DataTable 确实会损失一些性能,但是如果有 10-15 条记录,这会很重要。