基础知识:
IDictionary<TKey, TValue>
延伸IEnumerable<T>
public interface IDictionary<TKey, TValue>: ..,
IEnumerable<KeyValuePair<TKey, TValue>>
{
...
}
该类Enumerable
提供了扩展方法,这些方法提供了where
LINQ 中子句的实现
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
implements 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。