12

オブジェクトに対して LINQ クエリを実行したかったのですが、 をMatchCollection実装していないため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
    }
}
4

2 に答える 2

12

someStringフィルターを LINQに含めることもできます。

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>()代わりに を使用できます。

于 2009-07-09T01:00:47.237 に答える
3

IEnumerable を返す Cast 拡張メソッドを使用してみてください。

IEnumerable<Match> query = from Match m in fieldValues.Cast<Match>()
                           select m;

また、Cast メソッドを使用しない場合、コンパイラは「クエリ」のタイプを IEnumerable に推測します。

  var query = from Match v in fieldValues
                        select v;
于 2009-07-08T11:57:38.957 に答える