【问题标题】:Retrieve specific index from Dictionary [duplicate]从字典中检索特定索引[重复]
【发布时间】:2017-06-22 23:58:51
【问题描述】:

我想从电话簿中检索比尔的电话号码。

class PersonsName
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

// Dictionary Class, add contacts to phone book
Dictionary<PersonsName, int> phoneBook = new Dictionary<PersonsName, int>()
{
    {new PersonsName {FirstName = "Bill", LastName = "Gates" }, 5550100 },
    {new PersonsName {FirstName = "Mark", LastName = "Zuckerberg" }, 5551438 }
};

为什么下面给我一个找不到密钥的异常?如何在不遍历字典的情况下检索电话号码?

PersonsName personA = new PersonsName { FirstName = "Bill", LastName = "Gates" };
int billssNumber = phoneBook[personA]; //key not found

【问题讨论】:

  • 如果你真的需要它,你将不得不覆盖 Equals 方法。这是一个例子:stackoverflow.com/questions/634826/…
  • 您必须覆盖 GetHashCodeEquals 并且将您的对象设为只读,以将其用作字典中的键。
  • @Jannik - 请不要删除这样的内容。很难理解评论历史记录。
  • 获取元素的方式不对,试试这样。 PersonsName personA = new PersonsName { FirstName = "Bill", LastName = "Gates" }; int billssNumber = phoneBook.First(x=&gt;x.Key.FirstName==personA.FirstName &amp;&amp;x.Key.LastName==personA.LastName).Value;
  • @MAdeelKhalid:这将在 Keys 集合中执行 O(N) 搜索,而不是通过哈希码进行搜索。因此,使用字典不会有任何好处 - 使用常规集合可以实现相同的性能,例如 List&lt;&gt;

标签: c# dictionary generics


【解决方案1】:

您应该覆盖 PersonsName 类的 GetHashCode()Equals()。此链接应该对您有所帮助:Use custom object as Dictionary Key

希望对你有帮助!

【讨论】:

  • 那么在覆盖这些方法后如何获得特定值?
  • 如果您正确地实现它,您仍然可以通过以下方式访问它:int billssNumber = phoneBook[personA];
  • 酷它工作。 Equals() 和 GetHashCode() 方法是否在后台实现?我从来没有打电话给他们,所以我认为泛型是这样使用它们的?
  • 对于 GetHashCode() 方法,我将其返回:return FirstName.GetHashCode() ^ LastName.GetHashCode();但我真的不知道 ^ 符号代表什么。你碰巧知道吗?
猜你喜欢
  • 2021-09-23
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 2012-12-30
相关资源
最近更新 更多