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


92

我有以下代码:

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

Answers:


192
using System.Linq;

matches.Cast<Match>().Any(x => x.Groups["name"].Value.Length > 128)

您只需要将其从转换IEnumerableIEnumerable<Match>(IEnumerable <T>)就可以访问IEnumerable <T>上提供的LINQ扩展。


谁不赞成这里的每个答案?谢谢,这个答案引起了我的赞赏。
凯文·卡利托夫斯基2011年

+1我正试图弄清楚为什么它被否决了。我没看到
杰森

我真的很困惑,因为它是正确的,如何被否决
msarchet'9

1
这行得通,只需确保您using System.Linq还会给出语法错误
Ash Berlin-Taylor

1
Cast自C#8.0起,不需要任何困惑的人,谢谢,但是如果不提供该代码,则该代码将无法在较早的语言版本中进行编译。
rvnlord

46

当您指定显式范围变量类型时,编译器将插入对的调用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仅实现ICollectionIEnumerable,而没有实现IEnumerable<T>。几乎所有的LINQ to Objects扩展方法都针对IEnumerable<T>,除了Cast和明显的例外OfType,这两种方法都用于将“弱”类型的集合(例如MatchCollection)转换为通用类型IEnumerable<T>-然后可以进行进一步的LINQ操作。



8

试试这个:

var matches = myRegEx.Matches(content).Cast<Match>();

供参考,请参阅Enumerable.Cast

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

基本上,这是将IEnumerable变成的一种方式IEnumerable<T>


+1我正试图弄清楚为什么它被否决了。我没看到
杰森

@杰森:很可能有人试图提高答案。
Andrew Hare

3

我认为应该是这样的:

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

1
否。要点是MatchCollection只能执行IEnumerable。它不是强类型的。
杰森

2

您可以尝试如下操作:

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

-1

编辑:

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

这比我的要好,我不记得Any拥有谓词。
pstrjds 2011年

否。要点是MatchCollection只能执行IEnumerable。它不是强类型的。
杰森

@Jason,除了可以通过IEnumberable.Cast <T>
转换为

@msarchet:是的,我知道,这就是为什么我赞成你的回答。在编辑之前,这个答案甚至都不会编译。
杰森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.