C# 中的多数组排序
本文关键字:数组排序 | 更新日期: 2023-09-27 18:35:59
我有这个数组:
int[] a = {5, 2, 3};
int[] b = {4, 1, 2};
string[] c = {"John", "Peter", "Max"};
我需要对第二个数组 (b[]) 的值进行排序,但与其他两个数组相关,以便它们相应地排序。例如,1
将排在第一位,因为它是最小的数字,并且由于b[]
中的1
与a[]
中的2
和c[]
中的"Peter"
有关,那么这意味着2
和"peter"
也将移动到第一个排序位置。其他两列也是如此;观察:
int[] a = {2, 3, 5};
int[] b = {1, 2, 4};
string[] c = {"Peter", "Max", "John"};
我该怎么做?
我想我明白你在说什么。您希望根据 b
的值对数组a
和c
进行排序。
您可以使用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
,非常适合您要做的事情。
与其将数据存储在单独的未关联数组中,不如查看元组,或者如果可以的话,使用专用类来保持数据链接在一起
你能合并数组,使每个项目代表整个记录吗?
// 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);
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++;
}