是否可以在LINQ中表达此代码?

yon*_*236 17 c# linq

我正在为初学者阅读一本C#书,在本章的每一端,都有根据所学课程回答的练习.

其中一个练习是这样的:( 不是确切的措辞)

编写一个程序,接受一个int作为数组长度,以及数组的值.
然后将打印:
" 0 "如果数组没有按升序排序.如果排序则为
" 1 ".并且,
" 2 "如果它被排序,但有重复.

例:

// Sorted
Input: 1, 2, 3, 5
Print: 1

// Not sorted
Input: 2, 1, 3, 6
Print: 0

// Sorted, but with duplicates
Input: 2, 2, 3, 7
Print: 2
Run Code Online (Sandbox Code Playgroud)

我不知道我的逻辑是否是绝对的,但不知何故它是有效的,
我用我的方式使用这个代码:

int arrayLength = 0;
int prev, next;
int sortStatus = 1;

Console.Write("Input array Length: ");
arrayLength = Convert.ToInt32(Console.ReadLine());
int[] ar = new int[arrayLength];

for (int x = 0; x < arrayLength; x++)
{
    Console.Write("Input {0} value: ", (x+1).ToString());
    ar[x] = Convert.ToInt32(Console.ReadLine());
}

for (int x = 0; x < ar.Length-1; x++)
{
    prev = (int)ar[x];
    next = (int)ar[x + 1];

    if (next < prev)
        sortStatus = 0;
    if (next == prev)
        sortStatus = 2;
}

Console.Write(sortStatus.ToString());
Console.Read();
Run Code Online (Sandbox Code Playgroud)

是否有可能在LINQ中表达这一点?怎么样?

Kir*_*oll 17

if (ar.SequenceEqual(ar.OrderBy(x => x)))
{
    if (ar.Distinct().Count() == ar.Length)
        return 1;
    else
        return 2;
}
else 
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • @yonan,作为一般规则,非LINQ代码将胜过LINQ代码,假设您以最聪明的方式编写每个代码.但是请记住,LINQ允许我们更具表现力,因此权衡通常是值得的.还要考虑除非您正在编写性能密集型应用程序或者将LINQ代码识别为真正的瓶颈,否则担心轻微的性能差异就是机会成本.如果您还有其他事情要做,那就做其他事情吧. (2认同)

Ian*_*cer 5

一个纯粹的LINQ替代......(仅用于学术兴趣(但可能仍然比接受的答案更快!)

var input = new int[] { 1, 2, 3, 4, 5 };

var output = input.Zip(input.Skip(1), (a, b) => new {a=a, b=b})
                .Aggregate(1, (status, x) => status == 0 ? 0 : ((x.a > x.b ? 0 : (x.a == x.b ? 2 : status))));
Run Code Online (Sandbox Code Playgroud)

  • O(n)时间复杂度+1,与接受的答案不同. (3认同)