У меня такой код:
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 => ... );
using System.Linq
иначе это выдаст синтаксическую ошибкуCast
не нужен, начиная с C # 8.0, но код не будет компилироваться в более ранних языковых версиях, если он не предоставлен.Когда вы указываете явный тип переменной диапазона, компилятор вставляет вызов
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
andIEnumerable
, а неIEnumerable<T>
. Практически все методы расширения LINQ to Objects нацелены наIEnumerable<T>
, за заметными исключениямиCast
иOfType
, оба из которых используются для преобразования «слабо» типизированной коллекции (например,MatchCollection
) в универсальную,IEnumerable<T>
которая затем позволяет выполнять дальнейшие операции LINQ.источник
Попробуй это:
var matches = myRegEx.Matches(content).Cast<Match>();
Для справки см .
Enumerable.Cast
:По сути, это один из способов превратить файл
IEnumerable
вIEnumerable<T>
.источник
Думаю, это будет примерно так:
bool result = matches.Cast<Match>().Any(m => m.Groups["name"].Value.Length > 128);
источник
MatchCollection
только орудияIEnumerable
. Это не строго типизированный.Вы можете попробовать что-то вроде этого:
List<Match> matchList = matches.Cast<Match>().Where(m => m.Groups["name"].Value.Length > 128).ToList();
источник
РЕДАКТИРОВАТЬ:
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);
источник
MatchCollection
только орудияIEnumerable
. Это не строго типизированный.