ho sempre pensato che questi due metodi erano simili:differenti risultati tra dei rendimenti e LINQ Select
public static IEnumerable<Func<int>> GetFunctions()
{
for(int i = 1; i <= 10; i++)
yield return new Func<int>(() => i);
}
public static IEnumerable<Func<int>> GetFunctionsLinq()
{
return Enumerable.Range(1, 10).Select(i => new Func<int>(() => i));
}
Tuttavia, si ottengano risultati diversi quando li converte in List<Func<int>>
:
List<Func<int>> yieldList = GetFunctions().ToList();
List<Func<int>> linqList = GetFunctionsLinq().ToList();
foreach(var func in yieldList)
Console.WriteLine("[YIELD] {0}", func());
Console.WriteLine("==================");
foreach(var func in linqList)
Console.WriteLine("[LINQ] {0}", func());
L'uscita is:
[YIELD] 11
[YIELD] 11
[YIELD] 11
[YIELD] 11
[YIELD] 11
[YIELD] 11
[YIELD] 11
[YIELD] 11
[YIELD] 11
[YIELD] 11
==================
[LINQ] 1
[LINQ] 2
[LINQ] 3
[LINQ] 4
[LINQ] 5
[LINQ] 6
[LINQ] 7
[LINQ] 8
[LINQ] 9
[LINQ] 10
Perché è questo?
Nota che questo è stato "corretto" a partire da C# 5.0. http://stackoverflow.com/questions/12112881/has-foreachs-use-of-variables-been-changed-in-c-sharp-5 – juharr
@juharr È stato modificato in cicli 'foreach'. 'I cicli for' sono rimasti gli stessi. –
@JakubLortz È decisamente venerdì perché la mia comprensione della lettura è caduta sul pavimento. – juharr