如何在C#中创建排序索引?

时间:2016-07-31 08:21:07

标签: c# sorting

我有一个值数组,我想创建一个排序索引,即一个整数的辅助数组,它通过间接寻址按排序顺序列出元素。

换句话说,

I <= J -> Value[Index[I]] <= Value[Index[J]]

如何为Sort方法定义比较器来实现呢?值数组必须保持不变。

1 个答案:

答案 0 :(得分:1)

我看到构建这样一个索引的最简单方法是使用LINQ:

var Index = Enumerable.Range(0, Value.Length).OrderBy(i => Value[i]).ToArray();

或者如果您坚持使用Array.Sort,那么您可以使用接受Comparison<T>委托的重载:

var Index = new int[Value.Length];
for (int i = 0; i < Index.Length; i++)
    Index[i] = i;
Array.Sort(Index, (a, b) => Comparer<Value_Type>.Default.Compare(Value[a], Value[b]));

其中Value_TypeValue数组元素的类型。

另一个选择(最好的IMO)是创建一个可重用的通用比较器,如下所示:

public static class Comparers
{
    public static IComparer<int> CreateIndexComparer<T>(this IReadOnlyList<T> source, IComparer<T> comparer = null)
    {
        return new ListIndexComparer<T>(source, comparer);
    }

    private sealed class ListIndexComparer<T> : Comparer<int>
    {
        readonly IReadOnlyList<T> list;
        readonly IComparer<T> comparer;
        public ListIndexComparer(IReadOnlyList<T> list, IComparer<T> comparer = null)
        {
            this.list = list;
            this.comparer = comparer ?? Comparer<T>.Default;
        }
        public override int Compare(int x, int y)
        {
            return x != y ? comparer.Compare(list[x], list[y]) : 0;
        }
    }
}

并将其用于接受Array.Sort的<{1}}重载:

IComparer<T>