質問

私はMatchCollectionオブジェクトに対してLINQクエリを実行したかったが、それはICollection<T>を実装していないとして、これは不可能だった見つけ、ちょうどICollectionます。

コードの簡潔さの面でもパフォーマンスとメモリ使用量の両方、非ジェネリックコレクションでLINQを使用するための最良のオプションは何ですか?

(興味を持っている場合は、ここでは非LINQuifiedコードは次のとおりです。)

MatchCollection fieldValues = Regex.Matches(fieldValue, @"(?<id>\d+);#(?<text>[^;|^$]+)");
foreach (Match m in fieldValues)
{
    if (m.Groups["text"].Value.Equals(someString))
    {
        // Do stuff
    }
}
役に立ちましたか?

解決

あなたにもLINQを使用してsomeStringフィルタを含めることができます。

var matches = Regex.Matches(fieldValue, @"(?<id>\d+);#(?<text>[^;|^$]+)");
var textMatches = from Match m in matches
                  where m.Groups["text"].Value.Equals(someString)
                  select m;

foreach (Match m in textMatches)
{
    // Do stuff
}

コンパイラは、このようなクエリを変換することに注意してください...

var q = from MyType x in myEnum select x;

...これに...

var q = from x in myEnum.Cast<MyType>() select x;

...のでタイプとCast<T>()の両方を含むことは冗長である。

パフォーマンス面では、Cast<T>()は単に明示的な型キャストを行い、値を生成するので、パフォーマンスヒットは無視されます。あなたはすべてのメンバーが所望のタイプであるかわからないレガシーコレクションのために、あなたの代わりにOfType<T>()を使用することができます。

他のヒント

のIEnumerableを返しますキャストの拡張メソッドを使用してみてください。

IEnumerable<Match> query = from Match m in fieldValues.Cast<Match>()
                           select m;
あなたはキャストメソッドを使用していない場合は、

とイベントコンパイラは、IEnumerableをへ「問い合わせ」のタイプを推測されます。

  var query = from Match v in fieldValues
                        select v;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top