Unity中使用FirstOrDefault筛选结构体列表最小距离配对问题
现有代码的核心问题
- 匹配条件写反:你循环的变量
i是clist里的C类元素,筛选条件写的是x.p == i,x.p是plist里的P类元素,两者完全不属于同一个集合,不可能匹配到有效数据。 - 缺少去重和结果存储逻辑:就算把条件改对,直接对每个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
相关产品推荐
相关产品推荐

