Использование синтаксиса метода расширения Linq на MatchCollection

У меня есть следующий код:

MatchCollection matches = myRegEx.Matches(content);

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

Есть ли способ сделать это, используя синтаксис метода расширения Linq? Что-то вроде этого..

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

Ответ 1

using System.Linq;

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

Вам просто нужно преобразовать его из IEnumerable в IEnumerable<Match> (IEnumerable), чтобы получить доступ к расширению linq, предоставленному в IEnumerable.

Ответ 2

Когда вы указываете тип переменной явного диапазона, компилятор вставляет вызов Cast<T>. Итак:

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

в точности эквивалентно:

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

который также может быть записан как:

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

В этом случае требуется вызов Cast, потому что MatchCollection реализует только ICollection и IEnumerable, а не IEnumerable<T>, Почти все методы расширения LINQ to Objects нацелены на IEnumerable<T>, с заметными исключениями Cast и OfType, которые оба используются для преобразования "слабо" типизированной коллекции (например, MatchCollection) в generic IEnumerable<T> - который затем допускает дальнейшие операции LINQ.

Ответ 3

Попробуйте следующее:

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

Для справки см. Enumerable.Cast:

Преобразует элементы IEnumerable в указанный тип.

В основном это один из способов превращения IEnumerable в IEnumerable<T>.

Ответ 4

Я думаю, что это будет примерно так:

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

Ответ 5

Вы можете попробовать что-то вроде этого:

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

Ответ 6

EDIT:

 public static IEnumerable<T> AsEnumerable<T>(this IEnumerable enumerable)
 {
      foreach(object item in enumerable)
          yield return (T)item;
 }

Затем вы сможете вызвать этот метод расширения, чтобы превратить его в IEnumerable:

 matches.AsEnumerable<Match>().Any(x => x.Groups["name"].Value.Length > 128);