不清楚的Lambda表达式到数组.排序静态函数

本文关键字:数组 排序 静态函数 表达式 Lambda 不清楚 | 更新日期: 2023-09-27 18:02:02

我正在看一个关于如何使用array对int[]数组排序的示例。Sort函数,其中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 &y ?谁能给我一步一步的解释这个lambda ?

不清楚的Lambda表达式到数组.排序静态函数

参见Int32。比较此lambda表达式要替换的排序方法。通常,我们会有:

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

而不是:

  • x为奇数,y为偶数:返回-1
  • x奇数,y奇数或x偶数,y偶数:返回0
  • x为偶数,y为奇数:返回1

因为集合{1, 3, 5}{2, 4}中的元素是相等的,所以您将受用于最终集合的确切顺序的排序算法的支配。排序后的列表形式为{odds, evens},但这些子列表的顺序取决于算法。每个MSDN,数组。如果数组元素少于16个,则使用插入排序。

当我这样做时,我得到的顺序是{1, 3, 5, 2, 4},这是我所期望的,而不是{3, 5, 1, 2, 4}

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

  • x奇数,y偶数或(x奇数,y奇数,x> 0> y):返回-1
  • (x奇数,y奇数,同号)或x偶数,y偶数:返回0
  • x偶数,y奇数或(x奇数,y奇数,x <0 & lt;y):返回1

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

比较函数类型(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,但以一种更清晰的方式。