【问题标题】:How to get a single value from a Dictionary<Key,Value> given a property that belongs to the type Value给定属于 Value 类型的属性,如何从 Dictionary<Key,Value> 中获取单个值
【发布时间】: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


【解决方案1】:

FirstOrDefault代替Where

return people.Values.FirstOrDefault(p => p.SSN == socialSecurityNum);

【讨论】:

  • 呃,谢谢。我不知道为什么我没有想到。
  • @Drew,没问题 :)
  • @Drew 它发生在我们最好的人身上
  • 如果您想在有多个 socialSecurityNum 的人的特殊情况下例外,请考虑 SingleOrDefault
  • @HaraldCoppoolse,根据问题,FirstOrDefault 正是 OP 想要的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 2020-04-21
相关资源
最近更新 更多