【问题标题】:List vs Dictionary when referring by index/key [closed]通过索引/键引用时的列表与字典[关闭]
【发布时间】:2016-06-28 02:00:47
【问题描述】:

所以我一直主要使用列表从数据库中检索少量数据,这些数据馈送到 Web 应用程序中,但最近遇到了一些字典,这些字典生成了更多可读代码,但仅通过索引/引用时的性能差异是什么?钥匙?

我知道字典会占用更多内存,但在这种情况下最佳做法是什么?考虑到我不会执行搜索或对数据进行排序,是否值得在性能/维护上进行权衡?

【问题讨论】:

  • 您是否需要使用键搜索数据元素?
  • 为什么性能对您来说是个问题?
  • @Steve 理想情况下,我想用一个有意义的值来引用它,例如assetrecord["assetid"] 而不是assetrecord[0] 但这是我场景中的一般做法吗?这只是一条记录,所以我没有搜索。

标签: c# .net list dictionary


【解决方案1】:

当您确实想通过列表找到某个项目时,您应该看到所有项目,直到找到它的键。 让我们看一些基本的例子。你有

Person
{
   public int ID {get;set;}
   public string Name {get;set;}
}

你有收藏List<Person> persons,你想通过它的ID找到某个人:

var person = persons.FirstOrDefault(x => x.ID == 5);

正如所写,它必须枚举整个 List,直到它在 List 中找到具有正确 ID 的条目(条目 0 是否与 lambda 匹配?不...条目 1 是否与 lambda 匹配?不...等等等等)。 This is O(n)

但是,如果你想通过 Dictionary dictPersons 查找:

var person = dictPersons[person.ID];

如果您想在字典中按键查找某个元素,它可以立即跳转到它在字典中的位置 - 这是 O(1)。 O(n) 为每个人做这件事。 (如果您想知道这是如何完成的 - 字典对键运行数学运算,将其转换为字典内的一个位置的值,与插入时放置的位置相同。它被称为哈希函数)

所以,DictionaryList 快,因为 Dictionary 不会遍历所有集合,但 Dictionary 会从确切位置获取项目(哈希函数计算该位置)。这是一个更好的算法。

Dictionary 依赖链接(维护每个哈希表存储桶的项目列表)来解决冲突,而 Hashtable 使用重新哈希解决冲突(发生冲突时,尝试另一个哈希函数将密钥映射到存储桶)。 You can read how hash function works and difference between chaining and rehashing.

【讨论】:

    【解决方案2】:

    除非您确实遇到性能问题并且需要进行优化,否则最好使用更具可读性和可维护性的内容。尤其如此,因为您提到它是少量数据。毫不夸张地说,在应用程序的整个生命周期中,性能的累积差异(如果有的话)可能不等于通过使代码更具可读性而节省的时间。

    为了正确看待它,请考虑一下您的应用程序已经完成的工作,即读取请求标头、解析视图以及从配置文件中读取值。不仅列表和字典之间的性能差异很小,而且在您的应用程序仅服务单个页面请求的整个处理过程中也只是很小的一部分。

    即便如此,如果您发现性能问题并需要优化,可能还有很多其他优化(如缓存)会产生更大的影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 2012-06-09
      相关资源
      最近更新 更多