【发布时间】:2016-09-15 00:07:49
【问题描述】:
假设我有这本字典:
Dictionary<Guid, Person> people = new Dictionary<Guid, Person>();
假设它填充了一些数据。假设Person 有一个Ssn 属性。我想用Ssn = socialSecurityNum 将人返回,其中socialSecurityNum 是一些值。这是我必须这样做的最佳主意:
public Person GetPerson(int socialSecurityNum)
{
IEnumerable<Person> persons = people.Values.Where(p => p.SSN == socialSecurityNum);
foreach (Person person in persons)
{
return person;
}
return null;
}
我知道每个人会有不同的Ssn,所以我只返回列表中第一个值(因为列表只是一个值)。否则返回null。
我不喜欢这个解决方案的一点是,我必须从 linq 查询中获取一个列表,而不是单个值。是否有可以从字典中获取单个值的 linq 查询?
【问题讨论】:
-
通常,你会尝试设计你的代码,这样你就不会有这样低效的代码......
-
@Phil1970 你介意详细说明一下吗?我想尽可能改进我的代码,但我不确定你的意思。
-
好吧,如果你有 1000000 人,如果没有人拥有那个社会安全号码,你必须检查所有人。通常,您会将数据存储在数据库中并为该列创建一个索引,然后编写一个查询以单独获取该人。 基本上,如果可能,您会尽量避免使用 O(n) 进行搜索的算法。顺便说一下 Guid 与 SSN 的关系。也许,字典应该使用 SSN 作为键。
-
@Phil1970 啊,我明白了,谢谢。这实际上只是一个例子,因为我不想让这个问题与我实际使用的东西过于做作。字典最多会有十几个或两个条目大,所以我认为这种方法会很好。但是感谢您提供有关何时更大的建议,我想我应该在问题中指定这一点。
标签: c# .net linq dictionary lambda