在 MatchCollection 上使用 LINQ 扩展方法语法

我有以下密码:

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 => ... );
21954 次浏览

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>.

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>.

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);

I think it would be something like this:

bool result = matches.Cast<Match>().Any(m => m.Groups["name"].Value.Length > 128);

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 MatchCollection0 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.

You can try something like this:

List<Match> matchList = matches.Cast<Match>().Where(m => m.Groups["name"].Value.Length > 128).ToList();