2010-10-13 5 views
3

Puis-je faire l'une de ces LINQ:Puis-je faire cela avec LINQ?

1. Vérifiez que chaque élément dans un IEnumerable<string> a l'extension correcte. Si ce n'est pas le cas, lancez une exception.

foreach(var filepath in filepaths) 
    if(Path.GetExtension(filepath) != @".xml") 
     throw new ArgumentException(...); 


2. Prenez un IEnumerable<string> et serialise tous ses éléments en un seul string, avec des espaces entre chaque.

string args = ""; 
foreach (var filepath in filepaths) 
    args += filepath + " "; 

Merci

+2

donc tenté de répondre simplement: "oui" ^^ –

+0

@SealedSun Si vous aimez les downvotes, alors allez-y. :) – bzlm

Répondre

8
if (!filepaths.All(x => Path.GetExtension(x) == @".xml")) 
{ 
    throw error; 
} 

string.Join(" ", filepaths.ToArray()) pour la deuxième question.

+0

J'aime mieux les deux seulement parce que tous et "==" semble plus lisible que tout et "! =", Mais les deux feront très bien. – danijels

+1

C'est un point trivial, mais techniquement parlant, cela a une différence fonctionnelle avec le code OP: il sera lancé si la séquence est vide. – Ani

+0

@Ani vous avez raison, et je dirais même que ce n'est pas nécessairement trivial non plus. – danijels

5

1.

if(filePaths.Any(filepath => Path.GetExtension(filepath) != @".xml")) 
    throw new ArgumentException(...); 

2.

string args = string.Join(" ", filePaths.ToArray()); 

ou, avec LINQ (beaucoup plus inefficace):

string args = filePaths.Aggregate("", (combined, path) => combined + " " + path); 
+0

Inefficace? Avez-vous les chiffres pour le soutenir? – bzlm

+2

Linq sera inefficace car le type de chaîne est immuable et la concaténation de toutes les instances utilisant Aggregate aura des performances médiocres en comparaison. – danijels