4

我有一个工作场景,我们有几个不同的数据表,格式类似于以下:

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

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

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

41     S-HG-084-00   S-HG-085-00

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

ht.Add("HingeArms,33","S-HG-088-00,S-HG-089-00")

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

关于使用 Hashtable 或不同结构来做我正在寻找的事情的任何想法?它需要高性能,因为查找将在不同的代码部分中经常被调用。任何想法将不胜感激。谢谢。

4

3 回答 3

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();

抬头:

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" }
于 2012-05-07T18:20:24.497 回答
0

LINQ-to-Objects 怎么样(这绝不是一个高性能的解决方案,顺便说一句。)


    var ht = new Dictionary<string, string>();
    ht.Add("HingeArms,33", "S-HG-088-00,S-HG-089-00");
    decimal wantedHeight = 34.25m;

    var foundIt =
        ht.Select(x => new { Height = decimal.Parse(x.Key.Split(',')[1]), x.Key, x.Value }).Where(
            x => x.Height < wantedHeight).OrderBy(x => x.Height).SingleOrDefault();

    if (foundIt != null)
    {
        // Do Something with your item in foundIt
    }
于 2012-05-07T18:21:04.737 回答
0

您可以将排序的 .NET 数组与 Array.BinarySearch() 结合使用。如果你得到一个非负值,这是完全匹配的索引。否则,如果结果为负数,则使用公式

int index = ~Array.BinarySearch(sortedArray, value) - 1

获取先前“最近”匹配的索引。

最近的含义由您使用的比较器定义。它必须与您在对数组进行排序时使用的相同。看:

http://gmamaladze.wordpress.com/2011/07/22/back-to-the-roots-net-binary-search-and-the-meaning-of-the-negative-number-of-the-array-二进制搜索返回值/

于 2012-05-07T18:42:05.057 回答