在c#中表示此查找表的最佳方法

时间:2009-03-17 18:54:55

标签: c# lookup-tables

我需要在C#中表示一个查找表,这是基本结构:

Name    Range   Multiplier

Active  10-20   0.5

你们有什么建议?

我需要查找范围并检索乘数。 我还需要使用名称进行查找。

更新的 它总共可能有10-15行。 范围是整数日期类型。

4 个答案:

答案 0 :(得分:4)

你实际拥有的是两个查找表:一个是Name,另一个是Range。有几种方法可以在内存中表示这些,具体取决于表的大小。

“按名称”查找最常适合的是字典:

var MultiplierByName = new Dictionary<string, double>() { {"Active",.5}, {"Other", 1.0} };

范围比较棘手。为此,您可能只想存储最小或最大项目,具体取决于您的范围的工作方式。您可能还需要编写一个函数来将任何给定的整数减少到相应的存储键值(提示:使用整数除法或mod运算符)。

从那里你可以选择另一个字典(Dictionary<int, double>),或者如果它正常工作你可以让你的reduce函数返回一个顺序int并使用List<double>以便你的'key'变成一个索引。

但就像我说的那样:要确定最好的是我们真正需要知道查找中数据的范围和性质,以及您将用来访问它的方案。

答案 1 :(得分:3)

创建一个表示每一行的类。它将具有Name,RangeLow,RangeHigh和Multiplier属性。创建这样的行列表(从文件中读取或在代码中输入),然后使用LINQ查询它:

from r in LookupTable
where r.RangeLow <= x && r.RangeHigh >= x
select r.Multiplier;

答案 2 :(得分:2)

有时简单是最好的。我们正在查看多少条目,并且是您在示例中暗示的范围整数范围?虽然我可以想到几种方法,但首先想到的是维护两个不同的查找字典,一个用于名称,一个用于值(范围),然后只在范围字典中存储冗余信息。当然,如果你的范围是双打的,或者你的范围达到成千上万,我会寻找不同的东西,但我的书中有简单的规则。

答案 3 :(得分:1)

我会使用DataTable实现它,假设没有迫切的理由使用另一种数据类型。 DataTable.Select适用于在Name或Range上运行查找。你确实使用DataTable失去了一些性能,但是有10-15条记录就这么重要了。