在 C# 中使用类似于范围的查找表的最有效方法是什么?对于给定的数字,我想将其增加另一个数字。
我有一个像这样的查找表
1 1
5 6
10 60
因此,如果数字是 1-4,则加 1,如果数字是 5-9,则加 6,如果数字是 10 或更多,则加 60。
目前,我通过执行以下操作获得了一个可行的解决方案,但我想知道是否有更好的方法来实现相同的目标?
public int GetNewValue(int input)
{
var range = "1,1;2,1;3,1;4,1;5,6;6,6;7,6;8,6;9,6;10,60";
Dictionary<int, int> dic = ParseRanges(range);
int increment;
int total;
if (dic.TryGetValue(input, out increment))
{
total = input + increment;
}
else
{
dic.TryGetValue(10, out increment);
total = input + increment;
};
return total;
}
private static Dictionary<int, int> ParseRanges(string rangeString)
{
if (string.IsNullOrWhiteSpace(rangeString))
{
return null;
}
try
{
var newRange = new Dictionary<int, int>();
var ranges = rangeString.Split(';');
foreach (var range in ranges)
{
var minMax = range.Split(',');
if (minMax.Length != 2)
{
continue;
}
newRange.Add(Convert.ToInt16(minMax[0]), Convert.ToInt16(minMax[1]));
}
return newRange;
}
catch (Exception e)
{
}
return null;
}
}
当您需要持续访问给定的特定键(将一个键映射到一个值)时,字典非常有用。你这里没有。
假设您的键不是太多(少于 100 或 1000),线性搜索可能既简单又有效。如果您有很多键并且可以对字典中的键进行预排序,您也许能够执行二分搜索来有效地查询给定输入的正确增量。
public int GetNewValue(int input)
{
IDictionary<int, int> dic = ParseRanges(…);
int increment = 0;
foreach (KeyValuePair<int, int> entry in dic) {
increment = entry.Value;
if (entry.Key > input) break;
}
return input + increment;
}