如何确定哪种系列最适合您的要求

时间:2016-06-26 18:32:42

标签: c# .net

最近在接受采访时,我被问到一个问题 -

让我们在文件系统中有数十亿的数据[假设数据已被现有代码提取]我的任务是使用电子邮件ID作为具有最佳案例复杂性的搜索条件来查找人名。 哪个系列最适合这个?

public class Person
 {
     public string Name {get;set;}
     public string Email {get;set;}
 }

4 个答案:

答案 0 :(得分:2)

绝对Dictionary以电子邮件为核心 按键键是O(1)查找 电子邮件会很好地散列

对于值,您可以使用姓名或人

还有KeyedCollection即O(1),但几乎可以炫耀。

答案 1 :(得分:0)

IEnumerable<T>是以下扩展或实现的基本接口。它不允许直接访问,只读。因此,只有在您打算迭代集合时才使用它。

IQueryable<T>返回&#34;可查询的&#34;这是一个在将其发送到服务器之前仍然可以丰富的查询。

ICollection<T> extendsIEnumerable但另外允许添加,删除,测试集合中是否存在元素并获取元素总数。它不允许通过索引直接访问元素。这将是一个O(n)操作,因为您需要开始迭代它,直到找到相应的元素。

IList<T>扩展了ICollection(因此它继承了它的所有属性),但另外允许通过索引直接访问元素。这是O(1)操作。

List<T>只是IList接口的具体实现。

在代码中,您应始终公开对象层次结构中与呼叫者需求相对应的最高类型。因此,例如,如果调用者只是枚举数据集,请使用IEnumerable。如果他们需要通过索引公开IList直接访问元素。

List<T>只能由您的代码在内部使用,但通常不会出现在您公开的方法的签名中。这为您提供了更大的灵活性,因为您可以在不违反合同的情况下轻松交换具体实施。

答案 2 :(得分:0)

Dictionary<string,string>将是我的答案。

争论类的开销是相关的。在引擎盖下,密钥实现为哈希表。按键检索接近O(1)复杂度。

在您的情况下,唯一密钥将是电子邮件地址,而人的名称将是有价值的。

答案 3 :(得分:0)

您无法(或者真的,真的不应该)计划搜索数十亿个文件以找到具有匹配电子邮件地址的文件。这就像阅读图书馆中的每本书一样,找出哪些是由某位作者撰写的。你需要的东西(就像他们在图书馆一样)是一个索引。您可能必须完成所有工作以读取和解析所有内容以构建索引,但是当您需要特定文件或文件时,您需要搜索索引,而不是文件。

您可能会读取每个文件并将记录保存到包含诸如电子邮件地址等元素的数据库以及该文档的其他详细信息,然后使用该记录存储指向文件本身的指针(路径)。

这样,当您需要执行搜索时,您将执行SQL查询,而不是扫描数十亿个文件。

我不同意使用Dictionary。这本字典将来自哪里?如果您正在使用索引(如SQL表或表),那么您将查询它。没有理由查询表并构建一个巨大的内存中字典。如果您还希望文件可由其他某些属性查询,该怎么办?然后是什么 - 创建另一个字典?

这是一个很大的漏洞 - 它假设每个电子邮件地址都有一个文件。如果两个包含相同的电子邮件地址怎么办然后你有重复的密钥。

如果由于某种原因(如极快的性能)想要将大量数据存储在内存中,它仍然无法更改解决方案。较新版本的SQL Server将数据加载到内存中。但它仍然在SQL服务器上,可以更有效地处理查询。

关于使用哪个集合的问题以&#34;也是&#34;开头,表明它不是问题的核心。这很好,因为我认为它根本不相关。如果查询返回对多个文档的引用,则可以在IEnumerable<T>中返回结果 - 基础类型(List<T>,数组等)并不重要。