I'm a newbee for C# and encountereed an interesting Linq behavior as below.
FlipNumber
has the expected behavior, select by index Select((_, i) ...)
shown the correct behavior to flip the number string n.Length - 1
times, while FlipNumber1
only evaluated once as it select by item and with Last()
to obtain the last iteration result.
Can anyone help to explain it?
Simple test with the following code (forget the efficiency plz)
using System;
using System.Linq;
public class Test
{
public static string FlipNumber(string n)
{
Console.WriteLine($"FlipNumber");
return Enumerable.Range(0, n.Length - 1).Select((_, i) => {
n = new string(n.Take(i).Concat(n.Skip(i).Reverse()).ToArray());
Console.WriteLine($"{i} : {n}");
return n;
}).Last();
}
public static string FlipNumber1(string n)
{
Console.WriteLine($"FlipNumber1");
return Enumerable.Range(0, n.Length - 1).Select(i => {
n = new string(n.Take(i).Concat(n.Skip(i).Reverse()).ToArray());
Console.WriteLine($"{i} : {n}");
return n;
}).Last();
}
// suggested by @DiplomacyNotWar
// add `ToList()` before `Last()` makes the result same with FlipNumber
public static string FlipNumber11(string n)
{
Console.WriteLine($"FlipNumber11");
return Enumerable.Range(0, n.Length - 1).Select(i => {
n = new string(n.Take(i).Concat(n.Skip(i).Reverse()).ToArray());
Console.WriteLine($"{i} : {n}");
return n;
}).ToList().Last();
}
public static string FlipNumber2(string n)
{
Console.WriteLine($"FlipNumber2");
return n.Select(i => {
n = new string(n.Take(i).Concat(n.Skip(i).Reverse()).ToArray());
Console.WriteLine($"{i} : {n}");
return n;
}).Last();
}
public static void Main(string[] args)
{
FlipNumber("123456789");
FlipNumber1("123456789");
FlipNumber11("123456789");
FlipNumber2("123456789");
}
}
/*
Results:
FlipNumber
0 : 987654321
1 : 912345678
2 : 918765432
3 : 918234567
4 : 918276543
5 : 918273456
6 : 918273654
7 : 918273645
FlipNumber1
7 : 123456798
FlipNumber11
0 : 987654321
1 : 912345678
2 : 918765432
3 : 918234567
4 : 918276543
5 : 918273456
6 : 918273654
7 : 918273645
FlipNumber2
1 : 123456789
2 : 123456789
3 : 123456789
4 : 123456789
5 : 123456789
6 : 123456789
7 : 123456789
8 : 123456789
9 : 123456789
*/