Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数组的Lambda表达式不清楚。排序静态函数_C#_Arrays_Sorting_Lambda - Fatal编程技术网

C# 数组的Lambda表达式不清楚。排序静态函数

C# 数组的Lambda表达式不清楚。排序静态函数,c#,arrays,sorting,lambda,C#,Arrays,Sorting,Lambda,我正在看一个关于如何使用array.sort函数对int[]数组进行排序的示例,其中lambda表达式作为比较(tx,ty)委托传递,以对数组中的所有整数进行排序,使其能够首先放置奇数。代码如下: int[] numbers = { 1, 2, 3, 4, 5 }; Array.Sort (numbers, (x, y) => x % 2 == y % 2 ? 0 : x % 2 == 1 ? −1 : 1); // numbers

我正在看一个关于如何使用array.sort函数对int[]数组进行排序的示例,其中lambda表达式作为
比较(tx,ty)
委托传递,以对数组中的所有整数进行排序,使其能够首先放置奇数。代码如下:

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表达式所取代的排序方法。 通常,我们会:

  • x
    :返回-1
  • x==y
    :返回0
  • x>y
    :返回1
相反,我们有:

  • x奇数,y偶数:返回-1
  • x奇、y奇或x偶、y偶:返回0
  • x偶数,y奇数:返回1
由于集合
{1,3,5}
中的元素是相等的,而
{2,4}
中的元素是相等的,因此最终集合的确切顺序取决于排序算法。排序列表的形式为
{赔率,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
这意味着我们最终将得到一个列表,其形式为
{正几率,负几率,偶数}

请参阅此lambda表达式所替换的排序方法。 通常,我们会:

  • x
    :返回-1
  • x==y
    :返回0
  • x>y
    :返回1
相反,我们有:

  • x奇数,y偶数:返回-1
  • x奇、y奇或x偶、y偶:返回0
  • x偶数,y奇数:返回1
由于集合
{1,3,5}
中的元素是相等的,而
{2,4}
中的元素是相等的,因此最终集合的确切顺序取决于排序算法。排序列表的形式为
{赔率,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

这意味着我们最终将得到一个形式为
{正赔率,负赔率,偶数}

的列表。比较函数类型
(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));
    }
}

这与以前一样,根据数字的模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));
    }
}

这将按照与以前相同的方式对数字进行排序,基于它们的模2值,但以更清晰的方式进行排序。

如果您编写
Func f=(x,y)=>x%2==y%2?0:x%2==1?−1 : 1;f(1,2)
简单地调用它。它只是通过调用它来调用它。你想要什么样的解释?这个lambda是
IComparer
,它将为数组中的每个项目调用<代码>数组。排序
本身可以根据数组大小使用不同的排序算法。你可以在这里阅读-我不清楚你的实际问题是什么,正如Sergey链接到的,显示该方法需要被称为
数组。Sort(what,how)
,其中
what
是您的数组,而
how
IComparer
方法,它将被
数组调用。排序
几次以比较值对(这里,
x
y
)在分拣过程中,将其按正确顺序排列。这就是你想要的解释,还是别的什么?如果你写
Func f=(x,y)=>x%2==y%2?0:x%2==1?−1 : 1;f(1,2)
简单地调用它。它只是通过调用它来调用它。你想要什么样的解释?这个lambda是
IComparer
,它将为数组中的每个项目调用<代码>数组。排序
本身可以根据数组大小使用不同的排序算法。你可以在这里阅读-我不清楚你的实际问题是什么,正如Sergey链接到的,显示该方法需要被称为
Array.Sort(what,how)
,其中
what
是您的arr