J'essaie de mieux comprendre le mot-clé "rendement" et je pense que je le comprends assez bien. J'ai donc effectué quelques tests, mais j'ai été surpris par les résultats.
Si j'exécute le code ci-dessous, j'obtiens le résultat suivant qui montre qu'il boucle sur toute la plage et pas seulement jusqu'au numéro 4.
public void DoIt()
{
Console.WriteLine("Method Call");
var results = GetData(Enumerable.Range(1, 10));
Console.WriteLine("LINQ");
var filtered = results.Where(x => x == 4);
Console.WriteLine("Start result loop");
foreach (var item in filtered)
{
Console.WriteLine("Item is " + item);
}
}
private IEnumerable<int> GetData(IEnumerable<int> Input)
{
foreach (int item in Input)
{
if (item % 2 == 0)
{
Console.WriteLine("Found " + item);
yield return item;
}
}
}
Sortie :
Method Call
LINQ
Start result loop
Found 2
Found 4
Item is 4
Found 6
Found 8
Found 10
Si j'exécute le code ci-dessous, il montre qu'il n'arrive qu'à 4 et s'arrête ensuite.
public void DoIt()
{
Console.WriteLine("Method Call");
var results = GetData(Enumerable.Range(1, 10));
Console.WriteLine("Start result loop");
foreach (var item in results)
{
if (item == 4)
{
Console.WriteLine("Item is " + item);
break;
}
}
}
private IEnumerable<int> GetData(IEnumerable<int> Input)
{
foreach (int item in Input)
{
if (item % 2 == 0)
{
Console.WriteLine("Found " + item);
yield return item;
}
}
}
Sortie :
Method Call
Start result loop
Found 2
Found 4
Item is 4
Je suppose que je n'ai pas compris quelque chose, mais il semble que LINQ fasse le contraire de ce que j'attends de lui ? Je pensais que LINQ utilisait aussi le yield et l'exécution différée et je m'attendrais à ce que les résultats du second jeu de code soient les mêmes que ceux du premier jeu de code.