2016-05-21 3 views
-1

Итак, у меня есть три массива. Все они одинаковой длины и «связаны» таким образом, что, например, sums[52], prods[52] и indexes[52] вместе составляют часть информации. Они не объединены в двух- или трехмерный массив по более длинной, менее интересной причине.Сортировка основных массивов с дублирующимися ключами

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

Array.Sort(sums.ToArray(), prods); 
Array.Sort(sums.ToArray(), indexes); 
Array.Sort(sums); 

Довольно просто - сортирует два других на основе sums, затем сортирует sums.

К сожалению, sums имеет много повторяющихся значений. Таким образом, сортировка таким образом, может привести к чему-то вроде этого:

SUMS  PRODUCTS  INDEXES 
12  67   38 
12  52   107 
12  60   11 
13  42   98 
13  17   4 
18  21   60 

sums сортируется в порядке, и prods и indexes и матч. То, что я хотел бы сделать, это сортировать prods второстепенно. Поскольку sums - это «ключевой массив», но имеет дубликаты, он просто бросает prods в некотором случайном порядке. Это результат я пытаюсь получить:

SUMS  PRODUCTS  INDEXES 
12  52   107 
12  60   11 
12  67   38 
13  17   4 
13  42   98 
18  21   60 

sums сортируется, prods отображается на него, а затем во вторую очередь сортируются и indexes отображается что.

Я мог бы сделать некоторые очень неэффективные петли какого-то рода, но эта установка имеет дело с очень большими списками, и эффективность важна. Есть ли какой-то простой способ сделать это? Я не вижу ничего очевидного в проверке документации или поиске других людей для сортировки ключей массива.

+0

сколько данных мы говорим здесь? возможно, вы должны использовать sqlite – tofutim

+0

или использовать linq и просто объединить данные - http://techbrij.com/linq-combine-multiple-lists-parallel-c – tofutim

ответ

3

вы можете сделать это следующим образом:

class Item 
{ 
    public int sum; 
    public int prod; 
    public int index; 
} 


int[] sums = new int[] { 12, 12, 12, 13, 13, 18 }; 
int[] prods = new int[] { 67, 52, 60, 42, 17, 21 }; 
int[] indexes = new int[] { 38, 107, 11, 98, 4, 60 }; 

List<Item> Items = new List<Item>(); 
for (int i = 0; i < sums.Length; i++) 
{ 
    Item Item = new Item(); 

    Item.sum = sums[i]; 
    Item.prod = prods[i]; 
    Item.index = indexes[i]; 

    Items.Add(Item); 
} 

Items = Items.OrderBy(I => I.sum).ThenBy(I => I.prod).ThenBy(I => I.index).ToList(); 

sums = Items.Select(I => I.sum).ToArray(); 
prods = Items.Select(I => I.prod).ToArray(); 
indexes= Items.Select(I => I.index).ToArray(); 
+0

Мне не кажется, что OP просит включить 'indexes' как часть сортировки. Ваш второй 'ThenBy()' не нужен. Это также в основном то же самое, что и принятый ответ в вопросе, этот вопрос является дубликатом. –

1

памяти интенсивной, но может быть эффективным решением.

var sums = new int[] { 12, 12, 12, 13, 13, 18 }; 
    var prods = new int[] { 67, 52, 60, 42, 17, 21 }; 
    var indexes = new int[] { 38, 107, 11, 98, 4, 60 }; 

    var grouped = indexes.Zip(sums, (first, second) => new { Index = first, Sum = second}) 
     .Zip(prods, (first, second) => new { Index = first.Index, Sum = first.Sum, Prod = second}).ToList(); 

    foreach (var group in grouped.OrderBy(g => g.Sum).ThenBy(g => g.Prod)) 
    { 
     Console.WriteLine("{0}\t{1}\t{2}", group.Sum, group.Prod, group.Index); 
    } 

приводит

12 52 107 
12 60 11 
12 67 38 
13 17 4 
13 42 98 
18 21 60 
+0

это похоже на решение Арвина - я полагаю, вам нужно уточнить, что вы подразумеваете под «эффективным», вы имеете в виду скорость? использование памяти? – tofutim

+1

Здесь нет оснований использовать 'Zip()'. Просто используйте 'Select()' для произвольного создания множества массивов в один анонимный тип за один раз. Например. 'var grouped = indexes.Select ((index, i) => new {Index = index, Sum = sums [i], Prod = prods [i]});'. В любом случае мне трудно понять, насколько это существенно отличается от другого ответа. –

+0

это не слишком отличается, после того, как я нажал submit, я увидел решение Арвина – tofutim

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