如果我有两个数组,x和y,其中y是x中每个元素的十个数值。现在,我想排序y。但是,y的顺序与x的顺序不同。所以,在排序y中哪个元素与之相关后,我无法分辨,例如x [0]。我想要一个“双重排序”。非常感谢您的帮助!
答案 0 :(得分:63)
Array.Sort
an overload接受两个数组;一个用于钥匙,一个用于物品。 两者的项目根据keys
数组进行排序:
int[] keys = { 1, 4, 3, 2, 5 };
string[] items = { "abc", "def", "ghi", "jkl", "mno" };
Array.Sort(keys, items);
foreach (int key in keys) {
Console.WriteLine(key); // 1, 2, 3, 4, 5
}
foreach (string item in items) {
Console.WriteLine(item); // abc, jkl, ghi, def, mno
}
所以在你的情况下,听起来像你想要的那样:
Array.Sort(y,x); // or Sort(x,y); - it isn't 100% clear
答案 1 :(得分:2)
怎么样?
var selectedArr = new int[] { 1, 3, 5, 7, 9 };
var unorderArr = new int[] { 9, 7, 5, 3, 1 };
var orderedArr = unorderArr.OrderBy(o => selectedArr.IndexOf(o));
答案 2 :(得分:1)
如果y总是x的十位值,y可能不应该存在 - 你应该在需要时直接从x计算它的值。
通常,只有在排序算法采用自定义“交换”功能时,才能对并行数组进行排序(无需手动滚动排序算法),您可以同时在两个数组中交换元素。 C ++中的std :: sort和C中的qsort不允许这样做。
同样在一般情况下,考虑单个数组,其中元素是一对项目,而不是每个项目的并行数组。这使得使用“标准”算法更容易。
答案 3 :(得分:0)
如果我们有两个复杂对象数组,并且想要根据两个数组之一对它们进行排序,那么我们可以使用下一种方法:
// We want to sort "people" array by "Name" and
// accordingly to it reorder "countries" array.
Person[] people = new Person[]
{
new Person {Name = "Fill"},
new Person {Name = "Will"},
new Person {Name = "Bill"},
};
Country[] countries = new Country[]
{
new Country {Name = "Canada"},
new Country {Name = "UK"},
new Country {Name = "USA"}
};
// Here we sort "people" array, but together with each "Person"
// in sorted array we store its "index" in unsorted array. Then we
// will use this "index" to reorder items in "countries" array.
var sorted = people
.Select((person, index) => new {person, index})
.OrderBy(x => x.person.Name)
.ToArray();
// Here "people" array is sorted by "Name", and
// "contries" array is reordered accordingly to it.
people = sorted.Select(x => x.person).ToArray();
countries = sorted.Select(x => countries[x.index]).ToArray();
另一种方法是使用方法Array.Sort with IComparer
的重载。首先,我们应该实现IComparer
:
private class PeopleComparer : IComparer<Person>
{
public int Compare(Person x, Person y)
{
return x.Name.CompareTo(y.Name);
}
}
然后我们可以对两个数组进行排序:
Array.Sort(people, countries, new PeopleComparer());
这里complete sample演示了这两种方法。