2011-07-22 5 views
0

J'ai la ligne ci-dessous dans mon code.C# Filtrage des collections via des fonctions étendues

Mon expctation est SkipWhile() va bloquer les valeurs nulles et ne passera que des valeurs valides à ForEach(). Mais les valeurs nulles sont également passées à ForEach(). Qu'est-ce qui pourrait échouer dans ce code?

logChildFolder.SkipWhile(path1 => string.IsNullOrEmpty(path1)) 
      .ToList<string>() 
      .ForEach(path2 => copyLogFiles(args.SetupInfo.SetupDataFolder, path2)); 
+0

Comme @Guffa dit ci-dessous, 'ToList()' déchets mémoire et le temps de traitement inutile, car elle crée une copie en mémoire de tous les résultats. – Groo

Répondre

4

Utilisez la méthode Where, i.e. .:

logChildFolder.Where(path1 => !string.IsNullOrEmpty(path1)) 

Supposons dans vos valeurs de code à logChildFolder sont: null, a, b, null. logChildFolder.SkipWhile(path1 => string.IsNullOrEmpty(path1)) renverra a, b, null.

2

La méthode SkipWhile ignorera seulement les premiers éléments tant qu'il y aura des valeurs nulles, dès qu'il y aura une valeur non nulle, il laissera simplement passer le reste des éléments. Utilisez la méthode Where pour filtrer les éléments.

De plus, vous mélangez un style fonctionnel avec un style non-fonctionnel. Utilisez simplement une boucle foreach pour boucler les éléments. Cela vous évitera de créer une liste intermittente aussi:

foreach (string path in logChildFolder.Where(p => !string.IsNullOrEmpty(p))) { 
    copyLogFiles(args.SetupInfo.SetupDataFolder, path); 
}