【问题标题】:Fastest data structure to check if a property within a list of objects matches检查对象列表中的属性是否匹配的最快数据结构
【发布时间】:2012-03-27 18:17:07
【问题描述】:

我有一个存储许多对象的列表。每个对象都有一个变量形式的属性。

我希望能够检查此列表中的任何项目是否包含特定属性。类似于 Dictionary 的 ContainsKey 方法。这种数据结构要保存非常大量的值,甚至可能是数百万,因此我想使用一种可以尽快检查属性的数据结构。

对于这项工作,字典会是最快的,还是有更快的数据结构?

编辑:

这是我想要实现的一个快速的小例子:

Dictionary<string, Person> persons = new Dictionary<string, Person>(); //where string contains the Person's name

bool isPresent = persons.ContainsKey("Matt");

【问题讨论】:

  • 这几百万条记录是从哪里来的?针对数据源的 IEnumerable查询 数据是最快的。将数百万条记录加载到内存中是不切实际的。让数据库/NOSQL 通过 LINQ 完成繁重的工作。
  • 你提前知道类型和属性吗? IE。您是否正在为“Region”属性测试“Order”对象?或者它是固定名称属性的未知对象?或者它可以使用动态?或者如果成员不固定,也许是 FastMember?要么...?要么...?请添加示例...
  • @tawman:根据记录的大小,将数百万条记录保存在内存中绝对是实用的(并且速度极快)。在之前的工作中,我设法通过将在数据库表中执行查找的代码转换为内存中的代码来极大地提高性能,并进行了调整以减少内存使用量。这一切都取决于上下文。
  • @JonSkeet 非常正确,乔恩和我说的是一般情况,因为我的大脑处于 MVC 模式 ATM 中。通常不会将数百万条记录加载到内存中。但是,我看到您清楚地指出了更广泛的实施范围。附言顺便说一句,享受您的 C# 深度书籍 +1
  • "每个对象都有一个变量形式的属性。" - 那句话不起作用 - 变量是存在于方法中的东西。您不能拥有作为变量的属性。也许发布一些(伪)代码来说明您的实际意思

标签: c# .net data-structures dictionary hashset


【解决方案1】:

听起来你基本上只需要一个包含所有属性值的HashSet&lt;T&gt; - 假设你真的只是想知道它是否被包含。

例如:

var allNames = new HashSet<string>(people.Select(person => person.Name));

【讨论】:

  • 我已经编辑了我的问题,以提供一个我所追求的快速示例。在我的特定情况下,HashSet 会比字典快吗?
  • @Sean:潜在地——你可能会获得更好的缓存一致性,因为没有“价值”可以存储。它肯定会更节省内存(假设一个明智的实现)。更重要的是,集合比字典(表示键/值映射)更准确地表示您感兴趣的内容(存在或不存在)。
  • 当您这样说时,听起来确实更适合我的具体问题。正如您所提到的,键/值映射虽然出现在我的示例中,但只是达到目的的一种手段——很可能仍然可以通过 HashSet 来说明。我试试看,谢谢!
【解决方案2】:

这取决于。如果你可以一次将数据加载到字典中,然后多次查询,那么字典显然是最快的数据结构。如果多个项目可以具有相同的属性值,则必须创建 Dictionary&lt;TKey,List&lt;TValue&gt;&gt; 或使用 LINQ 查找。

但是,如果每次查询时都必须加载列表,那么使用字典就没有任何好处。您可以在加载列表时检测到正确的属性,或者,如果您正在查询数据库,则尝试使用适当的 where 子句仅加载所需的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 2019-09-09
    • 2020-01-14
    • 2012-05-20
    • 2019-12-13
    相关资源
    最近更新 更多