【问题标题】:C# array.sort() for multiple arrays in Descending orderC# array.sort() 用于以降序排列的多个数组
【发布时间】:2016-09-02 20:53:27
【问题描述】:

我有两个名为权重和值的数组。我想根据权重的排序对值进行排序。这样做效果很好

Array.Sort(Weights,Values);

这给了我按升序排序的数组。我想按降序进行相同的排序。有没有更好的方法不使用 Array.Reverse(Weights) and Array.Reverse(Values)

【问题讨论】:

  • WeightsValues 多长时间?
  • 编写一个自定义比较器。

标签: c# arrays sorting


【解决方案1】:

您必须使用this overload 并提供自定义IComparer<T>。相对较新的Comparer<T>.Create 方法使这更容易,因为您可以简单地将委托或lambda 表达式转换为IComparer<T>,而无需自己编写完整的实现代码。从问题中不清楚WeightsValues 的数据类型是什么,但这里有一个分别使用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);

我还建议您考虑使用一个类来将权重和值存储在一起,而不是作为两个单独的数组。

【讨论】:

  • 谢谢你的回答。 Weights 是一个 int 数组,而 values 是一个 double 数组。我如何使用上面的代码处理这种情况?你能举个例子吗?
  • @Srini 您只需将Comparer&lt;double&gt; 更改为Comparer&lt;int&gt;
【解决方案2】:

首先,创建一个包含相应项目的结构。

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

【讨论】:

    猜你喜欢
    • 2016-10-29
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2018-08-26
    相关资源
    最近更新 更多