对与另一个数组相关的数组进行排序

时间:2009-12-26 20:09:09

标签: c# arrays

如果我有两个数组,x和y,其中y是x中每个元素的十个数值。现在,我想排序y。但是,y的顺序与x的顺序不同。所以,在排序y中哪个元素与之相关后,我无法分辨,例如x [0]。我想要一个“双重排序”。非常感谢您的帮助!

4 个答案:

答案 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演示了这两种方法。