2015-08-25 3 views
2

У меня есть два массива:Сортировки 2 массива одновременно по свойству

Vector3[] positions; 
Matrix4x4[] transforms; 

И точка в пространстве:

Vector3 point; 

Для каждой позиции я получаю расстояние от точки:

float distance = GetDistance(point, transforms[i] * positions[i]); 

Мне достаточно удобно с помощью делегатов для сортировки одного массива, но как я могу сортировать два массива одновременно?

Мне нужно, чтобы операция была как можно быстрее, поэтому я хотел бы избежать упаковки во временный массив и затем распаковать результат.

Я использую .NET 2.0, поэтому нет Linq.

+1

Что вы подразумеваете под * в то же время *? Вы хотите сказать, что после сортировки вы хотите, чтобы элементы, которые изначально имели соответствующие индексы, соответствовали индексам? Или вы просто хотите сортировать оба массива? – Patrick87

+1

Просьба предоставить некоторые данные для вашего кода (ввод/вывод). Тогда легче понять, чего вы хотите. – Neolisk

+0

Вы можете попытаться построить массив * индексов * и отсортировать их, а затем отсортировать остальные два массива в соответствии с индексами. –

ответ

2

Вместо управления двумя параллельными массивами вы должны использовать лучшую модель, которая связывает данные вместе.

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) 
1

Самое простое решение сделать что-то вроде того, что @evanmcdonnal предлагает и просто упаковать соответствующие элементы вместе (потому что они, очевидно, связаны между собой и должны быть частью одной и той же структуры данных). Затем сортируйте их, используя либо встроенную функцию сортировки, либо такую ​​вещь.

Если вы действительно против этого, по какой-либо причине, вам нужно будет написать свой собственный метод сортировки, который будет перемещать элементы обоих массивов одновременно.

Неоткомпилированный и непроверенный пример (но должны дать вам достойное представление о том, как действовать):

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); 

Обратите внимание, что я использовал пузырь рода здесь (который ни в коей мере эффективный, просто очень легко написать). Я предлагаю найти гораздо более эффективный алгоритм для использования, если вы решите пойти по этому маршруту.

Смежные вопросы