为什么`.Reverse()。TakeWhile(..)`似乎有一个无效的索引?

时间:2016-08-29 09:52:22

标签: c#

请参阅此代码:

using System;
using System.Linq;

public class Test {
  public static void Main() {
    var s = "5401";
    Console.WriteLine(s);
    var predicate = (d,i) => {
            var r = i > 0 ? s[i-1] >= s[i] : true;
            Console.Write($"{i}: {s[i]}; ");
            if(i > 0) Console.Write($"{i-1}: {s[i-1]};");
            Console.WriteLine($" result: {r}");
            return r;
            };
    Console.WriteLine(new String(s.TakeWhile(predicate).ToArray()));
    // the case:
    Console.WriteLine(new String(s.Reverse().TakeWhile(predicate).ToArray()));
  }
}

输出:

5401
0: 5;  result: True
1: 4; 0: 5; result: True
2: 0; 1: 4; result: True
3: 1; 2: 0; result: False
540
0: 5;  result: True
1: 4; 0: 5; result: True
2: 0; 1: 4; result: True
3: 1; 2: 0; result: False
104

为什么在第二种情况下调用Reverse()不起作用?

1 个答案:

答案 0 :(得分:5)

Enumerable.Reverse返回一个新的反转序列,但是你在两个循环中都指的是相同的字符串实例(s)(不受Reverse调用的影响)。这就是为什么你没有看到任何区别。