C# 按属性同时对2个数组排序

C# 按属性同时对2个数组排序,c#,arrays,sorting,C#,Arrays,Sorting,我有两个阵列: Vector3[] positions; Matrix4x4[] transforms; 还有一个空间点: Vector3 point; 对于每个位置,我都会得到与点的距离: float distance = GetDistance(point, transforms[i] * positions[i]); 我对使用委托对单个数组进行排序很满意,但是如何同时对两个数组进行排序呢 我需要操作尽可能快,所以我希望避免打包到临时数组中,然后解包结果 我使用的是.NET 2.0,因

我有两个阵列:

Vector3[] positions;
Matrix4x4[] transforms;
还有一个空间点:

Vector3 point;
对于每个位置,我都会得到与点的距离:

float distance = GetDistance(point, transforms[i] * positions[i]);
我对使用委托对单个数组进行排序很满意,但是如何同时对两个数组进行排序呢

我需要操作尽可能快,所以我希望避免打包到临时数组中,然后解包结果


我使用的是.NET 2.0,因此没有Linq。

与其管理两个并行阵列,不如使用更好的模型将数据绑定在一起

Tuple<Vector3, Matrix4x4>[] posTransforms;

//add like this
posTransforms.Add(new Tuple<Vector3, Matrix4x4>(vec, matrix));

// order by Y cooridinate of the vectors for example
posTransforms.OrderBy(x => x.Item1.Y)
Tuple[]后转换;
//像这样加上
添加(新元组(向量,矩阵));
//例如,按向量的Y坐标排序
posTransforms.OrderBy(x=>x.Item1.Y)

最简单的解决方案是按照@evanmcdonnal的建议,将相应的元素打包在一起(因为它们显然是相关的,应该是同一数据结构的一部分)。然后使用内置的排序函数或类似的东西对它们进行排序

如果出于任何原因确实反对这样做,则需要编写自己的排序方法,同时移动两个数组的元素

未编译且未经测试的示例(但应能让您对如何进行有一个良好的了解):

bool被分类;
做
{
isSorted=true;
对于(int i=0;i

请注意,我在这里使用了冒泡排序(它根本没有效率,只是非常容易编写)。如果你决定走这条路,我建议你找一个更有效的算法来使用。

你说的同时是什么意思?您的意思是,您希望最初位于相应索引的元素在排序完成后位于相应的索引吗?或者您只是想对两个数组进行排序?请为您的代码(输入/输出)提供一些数据。这样就更容易理解您想要什么。您可以尝试构建一个索引数组并对其进行排序,然后根据索引对其他两个数组进行排序。顺便说一句,临时数组不太可能对性能产生显著影响。恰恰相反-试图节省内存会导致这样的结果。你的问题毫无意义。。。如果数组具有并行索引(表示位置中的索引1与变换中的索引1对齐),则它们必须始终具有相同的排序顺序,否则应用程序将中断。为什么您首先需要对它们进行排序?有很多更好的选择,比如
元组[]两者都
(元组数组,每个元组都有vector3和matrix4x4,摆脱了这些松散连接的数据结构)。
bool isSorted;
do
{
    isSorted = true;
    for (int i = 0; i < positions.Length - 1; i++)
    {
        float distance = GetDistance(point, transforms[i] * positions[i]);
        float distanceNext = GetDistance(point, transforms[i + 1] * positions[i + 1]);
        if (distanceNext < distance)
        {
            var swapTransform = transforms[i];
            transforms[i] = transforms[i + 1];
            transforms[i + 1] = swapTransforms;

            var swapPosition = positions[i];
            positions[i] = positions[i + 1];
            positions[i + 1] = swapPosition ;

            isSorted = false;
        }
    }
} while(!isSorted);