104 votes

Utilisation de la syntaxe de la méthode d'extension Linq sur MatchCollection

J'ai le code suivant:

 MatchCollection matches = myRegEx.Matches(content);

bool result = (from Match m in matches
               where m.Groups["name"].Value.Length > 128
               select m).Any();
 

Y a-t-il un moyen de faire cela en utilisant la syntaxe de la méthode d'extension Linq? Quelque chose comme ça..

 bool result = matches.Any(x => ... );
 

213voto

msarchet Points 9059
 matches.Cast<Match>().Any(x => x.Groups["name"].Value.Length > 128)
 

Vous devez simplement convertir un IEnumerable en un IEnumerable<Match> (IEnumerable) pour avoir accès à l'extension linq fournie sur IEnumerable.

48voto

Jon Skeet Points 692016

Lorsque vous spécifiez un explicite gamme de type de variable, le compilateur insère un appel à l' Cast<T>. Donc ceci:

bool result = (from Match m in matches
               where m.Groups["name"].Value.Length > 128
               select m).Any();

est exactement équivalente à:

bool result = matches.Cast<Match>()
                     .Where(m => m.Groups["name"].Value.Length > 128)
                     .Any();

qui peut aussi être écrit comme:

bool result = matches.Cast<Match>()
                     .Any(m => m.Groups["name"].Value.Length > 128);

Dans ce cas, l' Cast appel est nécessaire, car MatchCollection n'implémente ICollection et IEnumerable, pas IEnumerable<T>. Presque tous les LINQ to Objects méthodes d'extension sont ciblées en IEnumerable<T>, à l'exception notable d' Cast et OfType, qui sont tous deux utilisés pour convertir un "faiblement" tapé collection (comme MatchCollection) dans un générique IEnumerable<T> - ce qui permet alors pour plus de LINQ opérations.

8voto

Andrew Hare Points 159332

Essaye ça:

 var matches = myRegEx.Matches(content).Cast<Match>();
 

Pour référence, s'il vous plaît voir Enumerable.Cast :

Convertit les éléments d'un IEnumerable en type spécifié.

En gros, c’est une façon de transformer un IEnumerable en un IEnumerable<T> .

3voto

pstrjds Points 6353

Je pense que ce serait quelque chose comme ça:

 bool result = matches.Cast<Match>().Any(m => m.Groups["name"].Value.Length > 128);
 

2voto

James Johnson Points 29414

Vous pouvez essayer quelque chose comme ça:

 List<Match> matchList = matches.Cast<Match>().Where(m => m.Groups["name"].Value.Length > 128).ToList();
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X