I have the following code:
MatchCollection matches = myRegEx.Matches(content);
bool result = (from Match m in matches
where m.Groups["name"].Value.Length > 128
开发者_Python百科 select m).Any();
Is there a way to do this using the LINQ extension method syntax?
Something like this:
bool result = matches.Any(x => ... );
using System.Linq;
matches.Cast<Match>().Any(x => x.Groups["name"].Value.Length > 128)
You just need to convert it from an IEnumerable
to an IEnumerable<Match>
(IEnumerable<T>) to get access to the LINQ extension provided on IEnumerable<T>.
When you specify an explicit range variable type, the compiler inserts a call to Cast<T>
. So this:
bool result = (from Match m in matches
where m.Groups["name"].Value.Length > 128
select m).Any();
is exactly equivalent to:
bool result = matches.Cast<Match>()
.Where(m => m.Groups["name"].Value.Length > 128)
.Any();
which can also be written as:
bool result = matches.Cast<Match>()
.Any(m => m.Groups["name"].Value.Length > 128);
In this case the Cast
call is required because MatchCollection
only implements ICollection
and IEnumerable
, not IEnumerable<T>
. Almost all the LINQ to Objects extension methods are targeted at IEnumerable<T>
, with the notable exceptions of Cast
and OfType
, both of which are used to convert a "weakly" typed collection (such as MatchCollection
) into a generic IEnumerable<T>
- which then allows for further LINQ operations.
Try this:
var matches = myRegEx.Matches(content).Cast<Match>();
For reference, please see Enumerable.Cast
:
Converts the elements of an
IEnumerable
to the specified type.
Basically it's one way of turning an IEnumerable
into an IEnumerable<T>
.
I think it would be something like this:
bool result = matches.Cast<Match>().Any(m => m.Groups["name"].Value.Length > 128);
You can try something like this:
List<Match> matchList = matches.Cast<Match>().Where(m => m.Groups["name"].Value.Length > 128).ToList();
EDIT:
public static IEnumerable<T> AsEnumerable<T>(this IEnumerable enumerable)
{
foreach(object item in enumerable)
yield return (T)item;
}
Then you should be able to call this extension method to turn it into an IEnumerable:
matches.AsEnumerable<Match>().Any(x => x.Groups["name"].Value.Length > 128);
精彩评论