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

回答:


192
using System.Linq;

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

あなただけからそれを変換する必要があるIEnumerableIEnumerable<Match>IEnumerableを<T>に提供さLINQの拡張機能へのアクセスを得るために(IEnumerableを<T>)。


ここですべての回答に投票するのは誰ですか?この答えは私の賛成票を獲得します。
Kevin Kalitowski、2011

+1これがなぜ反対票だったのかを理解しようとしています。私はそれを見ていません。
ジェイソン

これが正しいため、どのようにして反対票が投じられたかについて、私は本当に混乱しています
msarchet

1
これは機能します。using System.Linqそれ以外の場合は構文エラーが発生することを確認してください
Ash Berlin-Taylor

1
CastC#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変換する1つの方法です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です。強く型付けされていません。
ジェイソン2011

@Jason、ただしIEnumberable.Cast <T>を介してIEnumberable <T>に
キャスト可能

@msarchet:はい、わかっています。そのため、私はあなたの回答に賛成しました。この回答は、編集前はコンパイルさえされていなかったでしょう。
ジェイソン、2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.