c# - 通过索引/键引用时列表与字典

标签 c# .net list dictionary

因此,我主要使用列表从数据库中检索少量数据,并将其输入到 Web 应用程序中,但最近遇到了一些字典,它可以使用键生成更具可读性的代码,但是仅通过索引/引用时的性能差异是什么?关键?

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

最佳答案

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

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

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

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

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

但是,如果你想通过字典来查找 dictPersons :

var person = dictPersons[person.ID];

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

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

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

关于c# - 通过索引/键引用时列表与字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35963694/

相关文章:

c# - 有没有办法使 row.DefaultCellStyle.BackColor 固定,尽管重新绘制?

C#:如何仅按前 4 位数字以预定义的自定义顺序对数组进行排序?

c# - 在运行时查找对对象的引用

.net - 我需要处理任务吗?

c# - .NET 和 mySQL 的用户安全

c# - 如何在 C# 中动态创建字符串?

c# - 如何防止 ToString ("0,0") 返回 00

list - 在 F# 中应用 Fold 函数

python - 如果 __ 和 __ 在 ___ 那么

python - 以某种方式组合 2 个列表的元素