2010-11-05 2 views
3

Je voulais utiliser le SmartEnumerable de Jon Skeet pour boucler un Regex.Matches mais cela ne fonctionne pas.SmartEnumerable et Regex.Matches

foreach (var entry in Regex.Matches("one :two", @"(?<!\w):(\w+)").AsSmartEnumerable()) 

Quelqu'un peut-il m'expliquer pourquoi? Et proposez une solution pour le faire fonctionner. Merci.

L'erreur est:

'System.Text.RegularExpressions.MatchCollection' does not contain a definition 
for 'AsSmartEnumerable' and no extension method 'AsSmartEnumerable' accepting 
a first argument of type 'System.Text.RegularExpressions.MatchCollection' could 
be found (are you missing a using directive or an assembly reference?) 
+0

Comment ça ne marche pas? –

Répondre

7

EDIT: Je pense que vous avez oublié d'insérer l'appel .AsSmartEnumerable() dans votre exemple de code. La raison que ne compilera pas est parce que la méthode d'extension ne fonctionne que sur IEnumerable<T>, pas sur l'interface IEnumerable non générique.


Ce n'est pas que vous ne pouvez pas énumérer les correspondances de cette façon; c'est juste que le type de entry sera déduit comme object puisque la classe MatchCollection n'implémente pas l'interface générique IEnumerable<T>, seulement l'interface IEnumerable.

Si vous voulez coller avec frappe implicite, vous devrez produire un IEnumerable<T> pour aider le compilateur à:

foreach (var entry in Regex.Matches("one :two", @"(?<!\w):(\w+)").Cast<Match>()) 
{ 
    ... 
} 

ou, la plus belle façon avec typage explicite (le compilateur insère un casting pour vous):

foreach (Match entry in Regex.Matches("one :two", @"(?<!\w):(\w+)")) 
{ 
    ... 
} 

la meilleure façon de produire une smart-dénombrable est l'extension méthode prévue:

var smartEnumerable = Regex.Matches("one :two", @"(?<!\w):(\w+)") 
          .Cast<Match>() 
          .AsSmartEnumerable(); 

foreach(var smartEntry in smartEnumerable) 
{ 
    ... 
} 

Cela nécessitera une directive using MiscUtil.Collections.Extensions; dans votre fichier source.

+0

La conversion ne fonctionne pas pour moi (j'utilise .NET 4): ''System.Text.RegularExpressions.MatchCollection' ne contient pas de définition pour 'Cast' et aucune méthode d'extension 'Cast' n'accepte un premier argument de type ' System.Text.RegularExpressions.MatchCollection 'peut être trouvé (manque-t-il une directive using ou une référence d'assembly?) ' –

+2

Vous avez besoin d'une directive' using System.Linq' en haut de votre fichier. – Ani

+0

C'était tout - merci! –

Questions connexes