【问题标题】:Hashset vs. IQueryableHashset 与 IQueryable
【发布时间】:2011-01-20 18:50:33
【问题描述】:

最近我正在实现一个小型 sn-p 缓存我的结果,我这样做的方式是使用字典,如下所示:

 private Dictionary<ID, IQueryable<Results>> _simpleCache;

我们的想法是搜索具有由“ID”指定的 id 的所有结果,如果 Dictionary 包含键 == id,我们只需搜索 IQueryable 中存在的值,而不是进行数据库之旅。

今天早上我正在研究这段逻辑,我正在考虑用 HashSet 替换 IQueryable,如下所示:

private Dictionary<ID, HashSet<Results>> _simpleCache;

进行此更改是否可取?

【问题讨论】:

    标签: c# linq generics data-structures iqueryable


    【解决方案1】:

    是的,是的。通常,IQueryable&lt;T&gt; 表示您正在使用数据源提供程序,每次枚举可查询对象时都会查询该数据源提供程序(当然,并非总是这种情况,因为您可以调用 AsQueryable 扩展IEnumerable&lt;T&gt; 上的方法,它将为您提供 IQueryable&lt;T&gt; 实现而不是 IEnumerable&lt;T&gt; 实现)。

    为此,将IQueryable&lt;Results&gt; 存储在字典中实际上并不能防止第二次枚举时对数据源的任何命中。 每次您枚举它时,它都会向数据提供者发出请求。

    因此,您通常希望在客户端实现结果,通常调用ToListToArray扩展方法,然后使用IEnumerable&lt;Results&gt;Results[]作为TValue的类型参数你的字典。

    请注意,您可以使用HashSet&lt;T&gt; 来存储您的对象,但您必须确保实现IEquatable&lt;T&gt; 并覆盖GetHashCode,以便默认相等比较器执行比较Results 类型公开的ID 实例,或者你必须提供一个IEqualityComparer&lt;T&gt; 实现来做同样的事情。您很可能正在使用设计器生成的代码,但它不会为您执行此操作,并且您的对象将具有由引用而非值确定的相等性。

    【讨论】:

      猜你喜欢
      • 2013-09-03
      • 2011-07-02
      • 1970-01-01
      • 2020-04-28
      • 2011-06-09
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多