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

Tho*_*mas 83 c# linq

我有以下代码:

MatchCollection matches = myRegEx.Matches(content);

bool result = (from Match m in matches
               where m.Groups["name"].Value.Length > 128
               select m).Any();
Run Code Online (Sandbox Code Playgroud)

有没有办法使用Linq扩展方法语法执行此操作?像这样的东西......

bool result = matches.Any(x => ... );
Run Code Online (Sandbox Code Playgroud)

msa*_*het 173

using System.Linq;

matches.Cast<Match>().Any(x => x.Groups["name"].Value.Length > 128)
Run Code Online (Sandbox Code Playgroud)

您只需将其从一个IEnumerable转换为IEnumerable<Match>(IEnumerable)即可访问IEnumerable上提供的linq扩展.

  • 谢谢,对于任何困惑的人,自 C# 8.0 起不再需要“Cast”,但如果不提供,代码将无法在早期语言版本中编译。 (2认同)

Jon*_*eet 45

指定显式范围变量类型时,编译器会插入一个调用Cast<T>.所以这:

bool result = (from Match m in matches
               where m.Groups["name"].Value.Length > 128
               select m).Any();
Run Code Online (Sandbox Code Playgroud)

完全等同于:

bool result = matches.Cast<Match>()
                     .Where(m => m.Groups["name"].Value.Length > 128)
                     .Any();
Run Code Online (Sandbox Code Playgroud)

也可以写成:

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

在这种情况下,Cast调用是必需的,因为MatchCollection只实现ICollectionIEnumerable,没有IEnumerable<T>.几乎所有的LINQ to Objects扩展方法都是针对的IEnumerable<T>,有明显的例外CastOfType,两者都用于将"弱"类型的集合(例如MatchCollection)转换为泛型IEnumerable<T>- 然后允许进一步的LINQ操作.


And*_*are 6

试试这个:

var matches = myRegEx.Matches(content).Cast<Match>();
Run Code Online (Sandbox Code Playgroud)

供参考,请参阅Enumerable.Cast:

将a的元素转换为IEnumerable指定的类型.

基本上它是翻动的一种方式IEnumerableIEnumerable<T>.