2016-01-12 3 views
2

Как сортировать массив ключей на основе значений, хранящихся в отдельном массиве в C#Как отсортировать массив ключей на основе значений, хранящихся в отдельном массиве

Пример

int[] keys = new int[] {1, 2, 3, 4, 7}; 
double[] vals = new double[] {0.5, 0.2, 0.3, 0.1, 0.4}; 

Я хотел бы сортировать массив ключей на основе значений в массиве vals, т.е. получить следующий порядок ключей массива:

4, 2, 3, 7, 1 

Я пытался сделать следующее

Array.Sort(keys, (a, b) => vals[a].CompareTo(vals[b])); 

Но я получаю следующее сообщение об ошибке:

Additional information: Unable to sort because the IComparer.Compare() method returns inconsistent results. Either a value does not compare equal to itself, or one value repeatedly compared to another value yields different results. IComparer: 'System.Array+FunctorComparer`1[System.Int32]'. 

Я предполагаю, что а и Ь параметры см к ключевым значениям, а не к ключевым индексам в массиве ключей.

ответ

5

Это работает для вас?

int[] sorted = 
    vals 
     .Zip(keys, (v, i) => new { v, i }) 
     .OrderBy(x => x.v) 
     .Select(x => x.i) 
     .ToArray(); 

Это дает следующий результат:

result

+0

Спасибо за ответ, но это не совсем то, что я хотел достичь. Я обновил свой вопрос. Это не просто индексация, начиная с 1. Это скорее следует понимать как ключи. Извините за это недоразумение и, пожалуйста, посмотрите мой обновленный пример. –

+0

@SebastianWidz - Мой первый ответ отлично работает с клавишами. – Enigmativity