我有两个名为权重和值的数组。我想根据权重的排序对值进行排序。这样做完全没问题
Array.Sort(Weights,Values);
这给了我按升序排序的数组。我想按降序进行相同的排序。有没有更好的方法可以不使用
Array.Reverse(Weights) and Array.Reverse(Values)
答案 0 :(得分:4)
您必须使用this overload并提供自定义IComparer<T>
。相对较新的Comparer<T>.Create
方法使得这更容易,因为您可以简单地将委托或lambda表达式转换为IComparer<T>
,而无需自己编写完整的实现。从问题中我不清楚Weights
和Values
的数据类型是什么,但这里是分别使用double[]
和int[]
的示例:
var Weights = new [] { 1.7, 2.4, 9.1, 2.1, };
var Values = new [] { 7, 9, 5, 3, };
Array.Sort(Weights, Values, Comparer<double>.Create((x, y) => y.CompareTo(x)));
只是为了好玩,这是使用LINQ的解决方案:
var pairs = Weights.Zip(Values, Tuple.Create);
var orderedPairs = pairs.OrderByDescending(x => x.Item1);
我还建议你考虑使用一个类来存储权重和值,而不是两个单独的数组。
答案 1 :(得分:1)
首先,创建一个包含相应项目的结构。
var items =
Weights
.Select((weight, index) =>
new
{
Weight = weight,
Value = Values[index]
}
)
.OrderByDescending(item => item.Weight)
.ToArray();
然后你可以得到排序后的数组:
Weights = items.Select(item => item.Weight).ToArray();
Values = items.Select(item => item.Value).ToArray();
但你也可以尝试其中一个答案:
Better way to sort array in descending order