c# - 是否可以使用具有一系列值的哈希表?

标签 c# wpf hash hashtable

情况:

  1. 我有一组 X(例如 10,000)个捕获的屏幕坐标。
  2. 屏幕上显示的是一个虚拟键盘。这呈现为相邻矩形控件的行(在本例中为边框控件)。
  3. 我想将每个屏幕坐标转换为执行标准 HitTest 时它将命中的键,即哪个键是坐标。
  4. 这需要尽可能高效地完成。

可能的解决方案:

  1. 生成一组包含每个键的屏幕坐标(LeftX、RightX、TopY、BottomY)的键位置,并在屏幕键盘移动/调整大小时更新此位置。
  2. 遍历我捕获的屏幕坐标并查找它与哪个键相关。

问题:

忽略并行执行循环的潜在 yield ,我想了解用于获取屏幕坐标并根据存储的键位置集执行匹配键查找的最佳结构和查找技术。

知道键盘上的键是水平和垂直相邻的,我可以使用它来优化查找,例如创建一个键行哈希表,并使用屏幕坐标的 Y 分量返回 null(坐标不在键盘上)或另一个表示该行中键的哈希表。然后我可以使用屏幕坐标的 X 组件进行类似的查找。

请记住,键通常不会对齐到列中,因此我必须先查找一行,然后再查找一行中的键,而不是将屏幕坐标的 X 分量与列匹配,然后查找一个键入该列。

我怀疑使用标准 WPF HitTest 会非常低效,因为它会测试坐标下所有可能的视觉效果,而我只关心单个图层。

感谢您能给我的任何帮助。这可能是微不足道的,但我不熟悉基于一系列值的散列方法

最佳答案

如果您使用索引(因为它们比其他任何东西都更快),最快的 HitTest 是可能的。

为键盘的每个键分配一个整数(例如,扫描码)。然后像这样创建一个点图

int[] map = new int[ymax * xmax]; // 1920*1200 = 2.304.000 (sizeof(int) * 2.3 Mb)

虽然它会占用大量内存,但您可以使用它来映射其他内容。也可以先对键进行索引(假设会有大约 100 个键,您可以使用 byte 数组来保存键索引,但是您需要一个从索引到键的额外映射)。

map 告诉谁是像素的所有者。它可以是 0(没有人)或某人( key 扫描码/ key 索引/对象索引)。

HitTest 和

一样难
return map[x + y * xmax];

但在您的情况下,我建议将关键边界表示为 Rectangle。虽然迭代超过 100 个键(最差的键)和 Rectangle.Contains(point) 需要时间,但该解决方案可能足够好(并且占用很少的内存)。

关于c# - 是否可以使用具有一系列值的哈希表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21934922/

相关文章:

C# Expression Tree调用基类属性get方法

c# - 如果未找到项目,为什么 LINQ 的 First 方法不简单地返回 null?

c# - 使用切换按钮创建选择器

java - 计算多部分数据(多个字符串)的 md5 散列

node.js - 将密码哈希脚本从 GO 转换为 Nodejs

file - Go中如何一步返回hash和bytes?

c# - 什么时候应该尝试消除 switch 语句?

c# - 如何用空字符串替换出现的 "-"?

c# - 如何使用 .NET 从十六进制颜色代码中获取颜色?

c# - 在WPF中如何防止ScrollViewer内的控件展开