字典的多键查找

3

我正在解析一个文件,并希望以一种可以使用两个键查找的方式将其存储在查找结构中。

我有一个 User 实体,它具有 name、email 和 id,类型不重要。

我想将其存储在 Dictionary<User, id> 中,以便可以通过 User 进行查找获取用户 id。

我还希望实现另外一种方法,即: Dictionary<Id, User>

我可以创建两个结构并进行查找。这很容易。但我想使用单个结构来实现。

我在思考,是否可以这样做:

Dictionary<User, User>,然后实现一个 IEqualityComparer<User>

是否有更好的方法?

如何最佳实践地实现 IEqualityComparer?


既然id是User对象的属性,那么当您想从特定对象中获取id时,只需使用user.id。但是我猜想您是否想要反过来做,即使id不是公开的属性? - Albin Sunnanbo
我认为你没有理解我的问题。我可以将用户对象存储为键,但我无法仅通过ID进行查找。 - DarthVader
5个回答

1
无论您是否需要进行此类型的映射,您都可以使用单个字典来实现您所要求的功能。以下是一个粗略的示例:
var dict = new Dictionary<string, object>();
dict["ID_001"] = new User();
dict["USER_??"] = 001; // Need a unique user string to replace the "??"

当然,你可以编写任何你想要的字符串。如果你想在某些东西周围包装函数,你可以避免每次获取一个项目时都需要强制转换对象。(静态方法可能更适合你。)

User GetUser(int id, Dictionary<string, object> dict) 
{
    return (User)dict["ID_" + id];
}

那很聪明,应该可以工作。不过没有硬编码任何字符串怎么样? - DarthVader
@user177883:那么,你最终会得到一个基本上是 Dictionary<object, object> 的东西。这可能不值得。 - John Fisher

1

我不确定你的问题描述是否有意义,原因如下:

给定一个 User 对象,你知道它的 ID,因为 ID 是 User 的属性。因此,为什么你需要 Dictionary<User, Id> 呢?如果你有 Dictionary<Id, User>,你可以根据 ID 获取到用户,如果你有用户,你应该已经有了 ID,这样另一个字典就是不必要的。

或者说有时候你有一个不完整的 User 对象,ID 没有被填充吗?


在某些时候,我知道用户的{name和email},但不知道ID;而在另一些时候,我知道用户的ID,但不知道{name和email}。明白吗? - DarthVader
在这种情况下,听起来你需要两个字典:一个用于查找电子邮件(如果电子邮件不唯一,则连接名称),另一个用于查找ID。您不需要(或可能不希望)使用整个用户对象作为键的开销。我倾向于只使用两个字典:它简单而清晰。您可以使用一种键类型在字典中存储相同的对象两次,该键类型可以表示电子邮件或ID,但我不知道这会给您带来什么好处。 - mtreit

0

我知道这个问题很老了,但它在我刚刚进行的谷歌搜索中出现了,而且我对最佳答案并不满意。我建议使用元组作为字典的键。如果名称和电子邮件是字符串,而ID是整数,则可以使用元组。


0

由于您将id存储在User对象中,因此不需要User->id映射。


是的,我可以存储它。而且确实已经在那里了。 - DarthVader

0

你可以很容易地创建两个字典,因为条目已经按引用存储。但正如其他人所说,如果你有包含ID的用户,似乎永远不需要查找ID。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接