基礎:
IDictionary<TKey, TValue>
拡張しますIEnumerable<T>
public interface IDictionary<TKey, TValue>: ..,
IEnumerable<KeyValuePair<TKey, TValue>>
{
...
}
このクラスは、LINQの句Enumerable
の実装を提供する拡張メソッドを提供しますwhere
public static class Enumerable
{
...
public static IEnumerable<T> Where(this IEnumerable<T>,
bool Func<T> predicate)
{
...
}
}
LINQを使用する場合、コンパイラはクエリ構文をメソッドの呼び出しに変換しますEnumerable.Where
。
このメソッドから返されたものが繰り返されると、コレクションの各アイテムでIEnumerable<T>
述語が評価されます。
対応するアイテムが結果に生成されます。
したがって、次のようなリクエスト:
var l_res = from n in List where n.key == 1 select n;
の各アイテムを繰り返し処理しList
ます。
List
を実装IDictionary<TKey, TValue>
し、句がディクショナリのキーとして使用されるプロパティにある場合where
、キーを活用して各レコードの反復を回避し、ルックアップを実行するにはどうすればよいですか?
IEnumerable<T>
が実装であるかどうかをテストしてIDictionary<TKey, TValue>
、使用するのに最適なリクエストを選択できることはすでにわかっています。
if(list is IDictionary<int, T>)
{
var l_res = ((IDictionary<int, T>) list)[1];
}
else
{
var l_res = from n in List where n.key == 1 select n ;
}
しかし、このようなキー付きコレクションを処理するLINQに存在する何かを見逃したかどうかを知りたいです。
注:LINQ-to0SQLプロバイダーはIQueryable<T>
、同じ目的で式ツリーを使用しますが、私の質問はLINQ-to-Objectsについてです。