Mam następujący kod:
MatchCollection matches = myRegEx.Matches(content);
bool result = (from Match m in matches
where m.Groups["name"].Value.Length > 128
select m).Any();
Czy istnieje sposób, aby to zrobić przy użyciu składni metody rozszerzenia LINQ?
Coś takiego:
bool result = matches.Any(x => ... );
using System.Linq
inny, spowoduje to błąd składniowyCast
nie jest potrzebny od C # 8.0, ale kod nie zostanie skompilowany we wcześniejszych wersjach językowych, jeśli nie zostanie podany.Po określeniu jawnego typu zmiennej zakresu kompilator wstawia wywołanie
Cast<T>
. Więc to:bool result = (from Match m in matches where m.Groups["name"].Value.Length > 128 select m).Any();
jest dokładnie równoważne z:
bool result = matches.Cast<Match>() .Where(m => m.Groups["name"].Value.Length > 128) .Any();
który można również zapisać jako:
bool result = matches.Cast<Match>() .Any(m => m.Groups["name"].Value.Length > 128);
W tym przypadku
Cast
wywołanie jest wymagane, ponieważMatchCollection
tylko implementuje,ICollection
aIEnumerable
nieIEnumerable<T>
. Prawie wszystkie metody rozszerzenia LINQ to Objects są przeznaczone dlaIEnumerable<T>
, z godnymi uwagi wyjątkamiCast
iOfType
, z których oba są używane do konwertowania kolekcji typu „słabo” (na przykładMatchCollection
) na typ ogólnyIEnumerable<T>
- co następnie umożliwia dalsze operacje LINQ.źródło
Spróbuj tego:
var matches = myRegEx.Matches(content).Cast<Match>();
Aby uzyskać więcej informacji, zobacz
Enumerable.Cast
:Zasadniczo jest to jeden ze sposobów zmiany pliku
IEnumerable
wIEnumerable<T>
.źródło
Myślę, że byłoby to coś takiego:
bool result = matches.Cast<Match>().Any(m => m.Groups["name"].Value.Length > 128);
źródło
MatchCollection
tylko narzędziaIEnumerable
. Nie jest napisane silnie.Możesz spróbować czegoś takiego:
List<Match> matchList = matches.Cast<Match>().Where(m => m.Groups["name"].Value.Length > 128).ToList();
źródło
EDYTOWAĆ:
public static IEnumerable<T> AsEnumerable<T>(this IEnumerable enumerable) { foreach(object item in enumerable) yield return (T)item; }
Następnie powinieneś móc wywołać tę metodę rozszerzenia, aby przekształcić ją w IEnumerable:
matches.AsEnumerable<Match>().Any(x => x.Groups["name"].Value.Length > 128);
źródło
MatchCollection
tylko narzędziaIEnumerable
. Nie jest napisane silnie.