在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 => ... );
using System.Linq; matches.Cast<Match>().Any(x => x.Groups["name"].Value.Length > 128)
您只需要将其从IEnumerable
转换为IEnumerable<Match>
(IEnumerable)即可访问IEnumerable上提供的linq扩展。
当你指定一个明确的范围variablestypes时,编译器会向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
和IEnumerable
,而不是IEnumerable<T>
。 几乎所有的LINQ to Objects扩展方法都是针对IEnumerable<T>
, Cast
和OfType
这两个明显的例外,它们都被用来将一个弱types的集合(比如MatchCollection
)转换成一个通用的IEnumerable<T>
– 然后允许进一步的LINQ操作。
尝试这个:
var matches = myRegEx.Matches(content).Cast<Match>();
有关参考,请参阅Enumerable.Cast
:
将
IEnumerable
的元素转换为指定的types。
基本上这是一种将IEnumerable
转换为IEnumerable<T>
。
我认为这将是这样的:
bool result = matches.Cast<Match>().Any(m => m.Groups["name"].Value.Length > 128);
你可以尝试这样的事情:
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);