像 C# 中的范围一样使用查找表

问题描述 投票:0回答:1

在 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;
}
}
c# lookup
1个回答
0
投票

当您需要持续访问给定的特定键(将一个键映射到一个值)时,字典非常有用。你这里没有。

假设您的键不是太多(少于 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.