2016-08-29 1 views
0

は、このコードを参照してください。なぜ `.Reverse()。TakeWhile(..)`に無効なインデックスがあるようですか?

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 

を第2のケースでReverse()への呼び出しが動作しないのはなぜ?

+1

変数 'i'が間違っています。配列が逆であってもゼロで始まります。だからs [0 -1]は意味をなさない。 – jdweng

+0

うん、それを逃した。ありがとう! – Artyom

+0

(なぜ、マイナスになったのでしょうか?) – Artyom

答えて

5

Enumerable.Reverseは、新しい逆シーケンスを返しますが、両方のループで同じ文字列インスタンス(s)を参照しています(これはReverse呼び出しの影響を受けません)。そういうわけで、違いは見えません。

関連する問題