【发布时间】:2011-08-25 23:39:57
【问题描述】:
我需要一个包含 2 种不同类型(int 和 string,都是唯一的,因此它们只能出现在 1 个键内)的多个键的字典。下面是一个例子:组信息(GroupInfo)可以通过 GroupdId 或其中一个成员名称来查询:
GroupId MemberNames GroupInfo
{1, John, Mary, Joe} ==> {GroupInfo}
因此,当 id (1) 或成员名称之一 (John) 请求时,应返回组信息。
我的第一个解决方案是创建一个包含 GroupdId 和 MemberNames 的密钥,该方法使用覆盖的 Equals 方法比较 GroupIds 并查找成员列表。但是要使这些条目相等:
GroupId MemberNames
{0, John}
{1, null}
{1, Mary}
GetHashCode 必须返回相同的 const 值。这将导致字典成为链表,并且在最佳情况下性能下降到 O(N) 查找。
另一种解决方案是分别保留 2 个字典:GroupId ==> GroupInfo、MemberName ==> GroupInfo。
还有其他想法吗?
【问题讨论】:
-
能否将 GroupId 转换为字符串,以便使用单个字典?
-
您反对只使用这两个字典的原因是什么?这很简单,显然是正确的。
-
@Philipp +1 提供了一个我没想过的好解决方案。可以,但是您如何通过键删除?例如,给定一个键“John”,所有其他键也应该被删除。
-
我不知道字典查找是否允许这样做,但你能定义自定义比较器吗?一个查看
id,一个查看MemberName? -
@Philipp,我决定听从您的建议,使 GroupId 成为字典中的键之一(ID 和成员之间不会发生冲突)并使值保持反向引用键,这样如果一个被删除,其余的将被删除。您能否将您的评论转换为答案,以便我接受?
标签: c# .net-3.5 dictionary hashtable