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

Unity中使用FirstOrDefault筛选结构体列表最小距离配对问题

现有代码的核心问题

  1. 匹配条件写反:你循环的变量i是clist里的C类元素,筛选条件写的是x.p == i,x.p是plist里的P类元素,两者完全不属于同一个集合,不可能匹配到有效数据。
  2. 缺少去重和结果存储逻辑:就算把条件改对,直接对每个C取距离最近的P,也会出现多个C匹配同一个P的情况,不符合唯一配对的要求,而且你没有存储FirstOrDefault返回的结果,自然看不到有效输出。

解决方案

你已经把所有配对按距离从小到大排好序了,直接用贪心逻辑遍历即可:遇到配对的C和P都没被使用过就保留,直到凑齐4组配对。
对应实现代码:

// 用来记录已经被配对的C和P
HashSet<GameObject> usedC = new HashSet<GameObject>();
HashSet<GameObject> usedP = new HashSet<GameObject>();
// 存储最终配对结果
List<CPDistance> finalPairs = new List<CPDistance>();

foreach (var pair in query)
{
    // 当前配对的C和P都没被用,就采纳这个配对
    if (!usedC.Contains(pair.c) && !usedP.Contains(pair.p))
    {
        finalPairs.Add(pair);
        usedC.Add(pair.c);
        usedP.Add(pair.p);
        // 4组配对齐了就停止遍历,节省性能
        if (finalPairs.Count == clist.Count)
        {
            break;
        }
    }
}

// 输出验证结果
foreach (var pair in finalPairs)
{
    Debug.Log($"{pair.c.name}  {pair.p.name}  {pair.distance}");
}

这个逻辑运行后得到的finalPairs就是你需要的无重复最短距离配对。如果后续需要处理更多元素的配对、且要求全局总距离最小,可以使用匈牙利算法实现二分图最小权匹配,当前4个元素的场景用上述贪心方案完全满足需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:27:03