根据用户提供的索引

时间:2016-02-08 20:43:46

标签: c# sorting

在python中有一个函数(numpy.take)来排序数组中的数组,例如,如果我有一个数组(3x3):

a = [[1, 2, 3],[7,9,10],[3, 5,6]] 

我有一组设置索引

indices = [2, 0, 1]

结果应为

array([[ 3,  5,  6], [ 1,  2,  3], [ 7,  9, 10]]).

在C#中是否有直接的方法/函数,我可以传入一个锯齿状数组并产生相同的输出?

4 个答案:

答案 0 :(得分:3)

不是直接的,但你可以用Linq实现同样的目的

var a = new[] { new[] { 1, 2, 3 }, new[] { 7, 9, 10 }, new[] { 3, 5, 6 } };
var indices = new [] { 2, 0, 1 };
var sorted = indices.Select(i => a[i]).ToArray();
foreach(var s in sorted) Console.WriteLine(string.Join(", ", s));

请注意,这并不会检查您的指数是否全部在范围内。

答案 1 :(得分:2)

您可以使用LINQ轻松完成:

var a = new[] { new[] { 1, 2, 3 }, new[] { 7, 9, 10 }, new[] { 3, 5, 6 } };
var indices = new[] { 2, 0, 1};

var result = indices
    .Select(i => a[i])
    .ToArray();

如果您更喜欢列表,请.ToList()

答案 2 :(得分:1)

还有Array.Sort(keys, values) - MSDN

答案 3 :(得分:0)

var a = new[]
{
    new[] {1, 2, 3},
    new[] {7, 9, 10},
    new[] {3, 5, 6}
};

var indices = new[] {2, 0, 1};

var sortedArray = a.SortEx(indices);

SortEx

的位置
public static class Extensions
{
    public static T[][] SortEx<T>(this T[][] source, int[] indices)
    {
        return indices.Select(index => source[index]).ToArray();
    }
}

这假设indices数组中的所有索引都不在a范围内。