使用重复键对键数组进行排序

时间:2016-05-21 04:48:00

标签: c# arrays sorting key

所以我有三个阵列。它们都是相同的长度并且以这样的方式“链接”,例如,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按顺序完美排序,prodsindexes都匹配。我想做的是其次排序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映射到该值。

我可以做某种非常低效的循环,但这种设置处理非常大的列表,效率很重要。有这种简单的方法吗?我没有看到任何明显的检查文档或查找其他人用于数组键排序的用途。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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