You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何从ListView数据中筛选与CurrentX、CurrentY最邻近的项?

如何用LINQ实现二维(X/Y)数据的邻近匹配

首先,你需要把ListView中的数据转换成强类型对象,这样处理起来更直观且不易出错。先定义一个简单的数据类:

public class DataItem
{
    public string Name { get; set; }
    public int X { get; set; }
    public int Y { get; set; }
}

接下来把ListView的行数据转换成List<DataItem>:

var dataItems = new List<DataItem>();
foreach (ListViewItem item in yourListView.Items)
{
    dataItems.Add(new DataItem
    {
        Name = item.SubItems[0].Text,
        X = int.Parse(item.SubItems[1].Text),
        Y = int.Parse(item.SubItems[2].Text)
    });
}

要同时兼顾X和Y两个维度的邻近性,核心是计算每个数据点到目标点(CurrentX=25, CurrentY=27)的综合距离。常用的方法是欧几里得距离,为了避免开根号的计算开销,可以直接用距离的平方值进行比较(因为平方值的大小关系和原距离完全一致)。

用LINQ实现的话,只需要计算每个项的距离平方,然后按这个值排序,取最小的那个:

int currentX = 25;
int currentY = 27;

var closestItem = dataItems
    .Select(item => new 
    {
        Item = item,
        DistanceSquared = (item.X - currentX) * (item.X - currentX) + (item.Y - currentY) * (item.Y - currentY)
    })
    .OrderBy(result => result.DistanceSquared)
    .FirstOrDefault()?.Item;

对示例数据的验证:

计算每个点的距离平方:

  • A: (20-25)² + (15-27)² = 25 + 144 = 169
  • B: (10-25)² + (20-27)² = 225 + 49 = 274
  • C: (30-25)² + (28-27)² =25 +1=26

显然C的距离平方最小,会被选中,完全符合你的预期。

为什么之前的单维度方法不行?

你之前的代码只单独处理X或Y维度,没法综合两个维度的差异——比如A的X离25近,但Y的差距太大,单维度筛选会误选,而综合距离的方式能把两个维度的差异合并成一个衡量标准,确保选出整体最邻近的点。


内容的提问来源于stack exchange,提问作者purna valdo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:23:18