Saya memiliki kode berikut:
MatchCollection matches = myRegEx.Matches(content);
bool result = (from Match m in matches
where m.Groups["name"].Value.Length > 128
select m).Any();
Apakah ada cara untuk melakukan ini menggunakan sintaks metode ekstensi LINQ?
Sesuatu seperti ini:
bool result = matches.Any(x => ... );
using System.Linq
lain itu akan memberikan kesalahan sintaksisCast
tidak diperlukan sejak C # 8.0, tetapi kode tidak dapat dikompilasi dalam versi bahasa sebelumnya jika tidak tersedia.Saat Anda menentukan tipe variabel rentang eksplisit , kompilator menyisipkan panggilan ke
Cast<T>
. Jadi ini:bool result = (from Match m in matches where m.Groups["name"].Value.Length > 128 select m).Any();
persis sama dengan:
bool result = matches.Cast<Match>() .Where(m => m.Groups["name"].Value.Length > 128) .Any();
yang juga bisa ditulis sebagai:
bool result = matches.Cast<Match>() .Any(m => m.Groups["name"].Value.Length > 128);
Dalam hal ini
Cast
panggilan diperlukan karenaMatchCollection
hanya mengimplementasikanICollection
danIEnumerable
, tidakIEnumerable<T>
. Hampir semua metode ekstensi LINQ ke Objek ditargetkanIEnumerable<T>
, dengan pengecualian penting dariCast
danOfType
, keduanya digunakan untuk mengubah kumpulan yang diketik "lemah" (sepertiMatchCollection
) menjadi generikIEnumerable<T>
- yang kemudian memungkinkan untuk operasi LINQ lebih lanjut.sumber
Coba ini:
var matches = myRegEx.Matches(content).Cast<Match>();
Untuk referensi, silakan lihat
Enumerable.Cast
:Pada dasarnya, ini adalah salah satu cara untuk mengubah file
IEnumerable
menjadiIEnumerable<T>
.sumber
Saya pikir itu akan menjadi seperti ini:
bool result = matches.Cast<Match>().Any(m => m.Groups["name"].Value.Length > 128);
sumber
MatchCollection
hanya mengimplementasikanIEnumerable
. Ini tidak diketik dengan kuat.Anda dapat mencoba sesuatu seperti ini:
List<Match> matchList = matches.Cast<Match>().Where(m => m.Groups["name"].Value.Length > 128).ToList();
sumber
EDIT:
public static IEnumerable<T> AsEnumerable<T>(this IEnumerable enumerable) { foreach(object item in enumerable) yield return (T)item; }
Maka Anda harus dapat memanggil metode ekstensi ini untuk mengubahnya menjadi IEnumerable:
matches.AsEnumerable<Match>().Any(x => x.Groups["name"].Value.Length > 128);
sumber
MatchCollection
hanya mengimplementasikanIEnumerable
. Ini tidak diketik dengan kuat.