У меня есть следующий код:
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);