不清楚Lambda表达式到Array.Sort静态函数

时间:2014-05-05 18:19:37

标签: c# arrays sorting lambda

我正在看一个关于如何使用Array.Sort函数对int []数组进行排序的示例,其中lambda表达式作为Comparison<T> (T x, T y)委托传递,以对数组中的所有整数进行排序能够首先放置奇数。这是代码:

int[] numbers = { 1, 2, 3, 4, 5 };
Array.Sort (numbers, (x, y) => x % 2 == y % 2 
    ? 0 
    : x % 2 == 1 
        ? −1 
        : 1);
// numbers array is now { 3, 5, 1, 2, 4 }

Array.Sort()如何实际调用x&amp;你?有人会为我提供一步一步解释这个lambda吗?

2 个答案:

答案 0 :(得分:2)

有关此lambda表达式正在替换的排序方法,请参阅Int32.CompareTo。 通常,我们有:

  • x < y:return -1
  • x == y:return 0
  • x > y:return 1

相反,我们有:

  • x odd,y even:return -1
  • x odd,y odd OR x even,y even:return 0
  • x even,y odd:return 1

由于集合{1, 3, 5}中的元素相等且{2, 4}相等,因此您可以使用最终集合的确切顺序排序算法。排序列表的格式为{odds, evens},但这些子列表的顺序取决于算法。根据MSDN,Array.Sort使用插入排序,如果数组少于16个元素。

当我这样做时,我收到的订单是{1, 3, 5, 2, 4},这是我所期望的,而不是{3, 5, 1, 2, 4}

更新: 在评论中指出x % 2 == -1为负奇数整数,这意味着上面需要对一般int进行一些修改。 (我道歉,但我的数学背景意味着我认为mod是无符号值。)

  • x odd,y even OR(x odd,y odd,x&gt; 0&gt; y):return -1
  • (x odd,y odd,相同符号)OR x even,y even:return 0
  • x even,y odd OR(x odd,y odd,x&lt; 0&lt; y):return 1

这意味着我们最终得到了{positive odds, negative odds, evens}形式的列表。

答案 1 :(得分:2)

比较函数类型(T, T) => int更通用,但在某些常见情况下可能会令人讨厌。您的问题中的lambda表达式是基于它们的模2的值对数字进行排序,但是它的编写方式并不清楚。

如果要根据某个键比较项目,可以使用以下帮助程序方法进行比较。

public static class Functional
{
    public static Func<T, T, int> KeyComparison<T, K>(Func<T, K> key)
        where K : IComparable<K>
    {
        return (x, y) => Comparer<K>.Default.Compare(key(x), key(y));
    }
}

用法:

Array.Sort(numbers, Functional.KeyComparison(x => x % 2));

这会以与以前相同的方式对您的数字进行排序,基于它们的模2,但是以一种更清晰的方式。