C#中的多数组排序

时间:2012-06-01 19:34:27

标签: c# arrays

我有这个数组:

int[] a = {5, 2, 3}; 
int[] b = {4, 1, 2}; 
string[] c = {"John", "Peter", "Max"};

我需要对第二个数组(b [])的值进行排序,但是与其他两个数组相关,以便它们相应地进行排序。例如,1将首先出现,因为它是最低的数字,并且1中的b[]2a[]中的"Peter"相关联c[],这意味着2"peter"也会转移到第一个排序位置。其他两列也是如此;观察:

int[] a = {2, 3, 5}; 
int[] b = {1, 2, 4}; 
string[] c = {"Peter", "Max", "John"};

我该怎么做?

4 个答案:

答案 0 :(得分:8)

我想我明白你在说什么。您希望根据a的值对数组cb进行排序。

您可以使用Array.Sort按另一个数组对数组进行排序,这样您就可以为键指定另一个数组:

int[] a = { 5, 2, 3 }; 
int[] b = { 4, 1, 2 };
string[] c = { "John", "Peter", "Max" };

Array.Sort(b.ToArray(), c);
Array.Sort(b.ToArray(), a);
Array.Sort(b);
Console.WriteLine(string.Join(", ", a));
Console.WriteLine(string.Join(", ", b));
Console.WriteLine(string.Join(", ", c));

这将输出您的预期值。请注意,我们使用ToArray在按键排序时创建数组的副本,这是因为Array.Sort对它们的键和值进行排序,这是我们不想要的。我们不会将密钥(在这种情况下为b)排序到最后。

这就是我们解决您眼前问题的方法。但是,从评论中收集,您正在尝试对表格数据进行排序。当您的数据具有某种结构时,请说如下:

public class Item
{
    public int A { get; set; }
    public int B { get; set; }
    public string C { get; set; }
}

很容易

var items = new[]
{
    new Item {A = 5, B = 4, C = "John"},
    new Item {A = 2, B = 1, C = "Peter"},
    new Item {A = 3, B = 2, C = "Max"},
};
var sortedItems = items.OrderBy(i => i.B).ToArray();

这使用LINQ,这非常适合您的目标。

答案 1 :(得分:1)

您可能希望查看Tuples,或者如果可以,使用专用类来保持数据链接在一起,而不是将数据存储在单独的无关联数组中

答案 2 :(得分:1)

你能整合数组,使每个项目代表一个完整的记录吗?

// using anonymous types for simplicity
var source = new[] {
    new { a = 5, b = 4, c = "John" },
    new { a = 2, b = 1, c = "Peter" },
    new { a = 3, b = 2, c = "Max" }
};
var results = source.OrderBy(x => x.a);

答案 3 :(得分:0)

var indices = Enumerable.Range (0, a.Length).ToArray ();
var sortedIndices = indices.OrderBy (j => a [j]);

var i = 0;
foreach (var j in sortedIndices) {
   anew [i] = a [j];
   bnew [i] = b [j];
   cnew [i] = c [j];
   i++;
}