Souvent, lorsque j'ai affaire à des séquences LINQ, je veux envoyer chaque élément à une méthode retournant void, en évitant une boucle foreach. Cependant, je n'ai pas trouvé une manière élégante de faire ceci. Aujourd'hui, je l'ai écrit le code suivant:Envoyer des éléments dans une séquence LINQ à une méthode qui renvoie void
private StreamWriter _sw;
private void streamToFile(List<ErrorEntry> errors)
{
if (_sw == null)
{
_sw = new StreamWriter(Path.Combine
(Path.GetDirectoryName(_targetDatabasePath), "errors.txt"));
}
Func<ErrorEntry, bool> writeSelector =
(e) => { _sw.WriteLine(getTabDelimititedLine(e)); return true; };
errors.Select(writeSelector);
_sw.Flush();
}
Comme vous pouvez le voir, j'écrire une fonction lambda qui retourne juste vrai, et je me rends compte que la méthode Select retourne une séquence de booleans- Je vais simplement ignorer que séquence. Cependant, cela semble un peu noobish et jank. Y a-t-il une manière élégante de faire ceci? Ou suis-je juste en train de mal appliquer LINQ?
Merci.
Merci pour la réponse. J'ai quelques questions: Disons, pour une raison folle, j'ai appelé la méthode Count() sur la séquence de booléens que la méthode Select() renvoie. Cela forcerait l'énumération de la séquence et le code devrait fonctionner. Ma question est alors: pourquoi devrions-nous jamais utiliser lambdas avec des effets secondaires dans une requête LINQ? [EDIT: Merci pour le lien! Je vais vérifier cela.] –
Correct; appeler 'Count()' forcera la séquence à être énumérée. – SLaks
Vous ne devez jamais mélanger des effets secondaires avec LINQ car vos lambdas peuvent être exécutés plusieurs fois. Il peut être très difficile de savoir exactement combien de fois un lambda sera exécuté; vos lambdas devraient être idempotents. – SLaks