获取 .NET Hashtable(或其他结构)中最接近/下一个匹配

ric*_*cke 5 c# vb.net hashtable

我在工作中遇到一个场景,我们有几个不同的数据表,其格式类似于以下内容:

Table Name: HingeArms
Hght   Part #1       Part #2
33     S-HG-088-00   S-HG-089-00
41     S-HG-084-00   S-HG-085-00
49     S-HG-033-00   S-HG-036-00
57     S-HG-034-00   S-HG-037-00
Run Code Online (Sandbox Code Playgroud)

其中第一列(可能还有更多列)包含按升序排序的数字数据,并表示确定要获取的正确数据记录的范围(例如,高度 <= 33,则第 1 部分 = S-HG-088-00,高度 <= 41,则第 1 部分 = S-HG-084-00 等)

我需要查找并选择给定指定值的最接近的匹配项。例如,给定高度 = 34.25,我需要获取上面集合中的第二条记录:

41     S-HG-084-00   S-HG-085-00
Run Code Online (Sandbox Code Playgroud)

这些表当前存储在从 CSV 文件加载的数据的 VB.NET 哈希表“缓存”中,其中哈希表的键是表名称和表中表示“键”的一个或多个列的组合。记录。例如,对于上表,第一条记录的 Hashtable Add 将为:

ht.Add("HingeArms,33","S-HG-088-00,S-HG-089-00")
Run Code Online (Sandbox Code Playgroud)

这似乎不太理想,如果需要,我可以灵活地更改结构(缓存包含来自可以直接查找的其他表的数据......这些“范围”表只是被转储进去,因为它很“容易”)。我正在寻找 Hashtable/Dictionary 上的“Next”方法来为我提供范围内最接近的匹配记录,但这显然不适用于 VB.NET 中的股票类。

关于如何使用哈希表或不同的结构来完成我正在寻找的事情有什么想法吗?它需要具有高性能,因为查找会在代码的不同部分中经常被调用。任何想法将不胜感激。谢谢。

dtb*_*dtb 4

对于这种情况,哈希表并不是一个好的数据结构,因为项目根据其哈希码而不是其值分散在内部数组中。

使用排序数组List<T>并执行二分搜索,例如

设置:

var values = new List<HingeArm>
{
    new HingeArm(33, "S-HG-088-00", "S-HG-089-00"),
    new HingeArm(41, "S-HG-084-00", "S-HG-085-00"),
    new HingeArm(49, "S-HG-033-00", "S-HG-036-00"),
    new HingeArm(57, "S-HG-034-00", "S-HG-037-00"),
};

values.Sort((x, y) => x.Height.CompareTo(y.Height));

var keys = values.Select(x => x.Height).ToList();
Run Code Online (Sandbox Code Playgroud)

抬头:

var index = keys.BinarySearch(34.25);
if (index < 0)
{
    index = ~index;
}

var result = values[index];
// result == { Height = 41, Part1 = "S-HG-084-00", Part2 = "S-HG-085-00" }
Run Code Online (Sandbox Code Playgroud)

  • 另请注意,数组必须保持排序才能使用 BinarySearch。 (2认同)