2010-11-05 1 views
3

Я хотел использовать SmartEnumerable Jon Skeet для того, чтобы перевернуть Regex.Matches, но это не сработает.SmartEnumerable и Regex.Matches

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

Может кто-нибудь объяснить мне почему? И предложите решение, чтобы оно работало. Благодарю.

Ошибка:

'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

Как это работает? –

ответ

7

EDIT: Я думаю, что вы забыли вставить .AsSmartEnumerable() вызов в примере кода. Причина, по которой , что не будет скомпилирована, заключается в том, что метод расширения работает только с IEnumerable<T>, а не с не общим интерфейсом IEnumerable.


Это не значит, что вы не можете перечислить матчи таким образом; это просто, что тип entry будет охарактеризован как object, так как класс MatchCollection не реализует общий интерфейс IEnumerable<T>, только интерфейс IEnumerable.

Если вы хотите придерживаться неявной типизации, вам придется производить IEnumerable<T>, чтобы помочь компилятору из:

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

или, в более хорошем пути с явной типизацией (компилятор вставляет слепок для вас):

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

Самый простой способ для создания смарт-перечислимы это с помощью прилагаемого разгибания метода:

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

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

Для этого вам потребуется директива using MiscUtil.Collections.Extensions; в исходном файле.

+0

Кастинг не работает для меня (я использую .NET 4): '' System.Text.RegularExpressions.MatchCollection 'не содержит определения для' Cast 'и никакого метода расширения' Cast ', принимающего первый аргумент типа' System.Text.RegularExpressions.MatchCollection '(вам не хватает директивы using или ссылки на сборку?) ' –

+2

Вам нужна директива' using System.Linq' в верхней части файла. – Ani

+0

Так оно и было - спасибо! –