【发布时间】:2015-08-24 08:49:38
【问题描述】:
在c#中是否可以优雅地解决以下问题?
给定两个长度相等的数组(用于存储不同的数据类型),__a 和 __b,
Vector3[] __a = new Vector3[]{new Vector3(0,0,2), new Vector3(0,0,1), new Vector3(0,0,4), new Vector3(0,0,3)};
int[] __b = new int[]{1, 2, 3, 4 };
如何对 __a 进行排序,同时对 __b 进行相应的重新排序?
可以通过 System.Array.Sort() 或例如借助 LINQ 对 __a 进行排序。
在对 __a 进行排序后,对于本示例,按 z 坐标排序,输出将如下所示: (0,0,1), (0,0,2), (0,0,3), (0,0,4)
而且,__b 应该被重新排列成: 2,1,4,3
this question might look simmilar,但在我目前的情况下,数组的大小始终相同。它们的内容不能相互比较。 相反,移动 __a 中的元素应该会导致 __b 中的相应元素发生相同的变化。
This question again relies on comparing internal variables of objects. 在本例中,我使用了 Vector3 和 int 数据类型,但实际上 __B 可以携带对自定义对象的引用,并且无法进行比较。
有没有办法“扩展” Array.Sort() 以便在重新排列 __a 时,以完全相同的方式重新排列 __b?也许有一种方法可以使用 LINQ?
【问题讨论】:
-
谢谢@spyr03,我确实可以使用包装类来保存来自 A 的 1 个条目和来自 B 的一个条目。然后我可以创建这些包装器的数组。通过 Wrapper 的 A 条目对该数组进行排序将意味着 B 条目也被重新排列。然后,我可以遍历 B 的包装器及其条目,创建一个重新排列的 B 数组。但是在考虑是否可以以更简单的方式实现,而无需额外的外壳
-
可能是 Array.ParallelSort() 之类的:D