Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取.NET哈希表(或其他结构)中最近的/下一个匹配项_C#_Vb.net_Hashtable - Fatal编程技术网

C# 获取.NET哈希表(或其他结构)中最近的/下一个匹配项

C# 获取.NET哈希表(或其他结构)中最近的/下一个匹配项,c#,vb.net,hashtable,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 其中,第一列(可能更多)包含升序排序的数字数据,并表示一个范围,

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

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

其中,第一列(可能更多)包含升序排序的数字数据,并表示一个范围,以确定要获取的数据的正确记录(例如,高度),因此哈希表不是一个好的数据结构,因为项目根据其哈希代码而不是其值分散在内部数组中

使用排序的or并执行二进制搜索,例如

设置:

var值=新列表
{
新HingeArm(33,“S-HG-088-00”、“S-HG-089-00”),
新HingeArm(41,“S-HG-084-00”、“S-HG-085-00”),
新HingeArm(49,“S-HG-033-00”、“S-HG-036-00”),
新HingeArm(57,“S-HG-034-00”、“S-HG-037-00”),
};
排序((x,y)=>x.Height.CompareTo(y.Height));
var keys=values.Select(x=>x.Height.ToList();
查找:

var-index=keys.BinarySearch(34.25);
如果(指数<0)
{
索引=~index;
}
var结果=值[指数];
//结果=={Height=41,Part1=“S-HG-084-00”,Part2=“S-HG-085-00”}
LINQ to Objects(顺便说一句,这绝不是性能解决方案)怎么样


var ht=新字典();
ht.添加(“HingeArms,33”,“S-HG-088-00,S-HG-089-00”);
十进制wantedHeight=34.25m;
var foundIt=
选择(x=>new{Height=decimal.Parse(x.Key.Split(',')[1]),x.Key,x.Value})(
x=>x.Heightx.Height).SingleOrDefault();
if(foundIt!=null)
{
//对foundIt中的项目执行某些操作
}

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

int index = ~Array.BinarySearch(sortedArray, value) - 1
获取以前“最近”匹配的索引

最近值的含义由您使用的比较器定义。它必须与排序数组时使用的相同。请参阅:


还要注意,数组必须保持排序,才能使用BinarySearch。您还需要检查是否找到了完全匹配的项,如果没有,则检查目标之前或之后的项是否最接近。@Servy:似乎高度提供了一个上限:OP说“例如,高度回答得很好。
BinarySearch
功能不接受
比较
委托,这是很糟糕的,但是如果您想避免为键单独列出一个列表(这会在添加/编辑/删除时产生一些额外的成本)您总是可以创建一个
比较器
类,并将其发送到
BinarySearch
函数中。@dtb:BinarySearch有点狡猾,我没有意识到它返回了它停止的项的位补码…yahtzee。我需要找到一种方法来处理可能有多个“键”的其他情况值(例如宽度
ht.Add("HingeArms,33","S-HG-088-00,S-HG-089-00")
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" }

    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
    }
int index = ~Array.BinarySearch(sortedArray, value) - 1