我有一个值数组,我想创建一个排序索引,即一个整数的辅助数组,它通过间接寻址按排序顺序列出元素。
换句话说,
I <= J -> Value[Index[I]] <= Value[Index[J]]
如何为Sort
方法定义比较器来实现呢?值数组必须保持不变。
答案 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_Type
是Value
数组元素的类型。
另一个选择(最好的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>