所以我有三个阵列。它们都是相同的长度并且以这样的方式“链接”,例如,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 :(得分: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