非ジェネリックいるICollectionを実装するクラスでLINQを使用します
-
11-09-2019 - |
質問
私は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;
所属していません StackOverflow