2010-10-21 121 views
3

我正在解析一个文件,我想以一种可以用两个键查找的方式将其存储在查找结构中。字典的多键查找

我有一个User Entityname, emailid,类型是无关紧要的。

我想将它存储在Dictionary<User, id>中,这样我可以通过用户查找来获取用户ID。

我也希望周围的其他方法,即:Dictionary<Id, User>

我可以创建两个结构,并做了查找。这很容易。我想用一个单一的结构来做。

我很好奇,如果我能做到这一点单一结构

我在想,我可以这样做:

Dictionary<User, User>,然后实施IEqualityComparer<User>

有没有更好的方式来做到这一点?

实施IEqualityComparer的最佳做法是什么?

+0

由于id为用户对象,当你想从一个特定对象获得ID只是USER.ID上的属性。但是,我猜你想做相反的事情,即使id不公开吗? – 2010-10-21 20:04:04

+0

我不认为你明白我问了什么。我可以将用户对象存储为密钥,然后我不能仅通过id进行查找。 – DarthVader 2010-10-21 20:05:16

回答

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]; 
} 
+0

这是聪明的,应该工作。如果没有硬编码任何字符串? – DarthVader 2010-10-21 20:17:09

+0

@ user177883:然后,你最终会得到一个** Dictionary **这可能不值得。 – 2010-10-21 20:32:06

0

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

+0

是的,我可以存储它。它就在那里。 – DarthVader 2010-10-21 20:04:39

1

我不知道你的问题的描述是有道理的,原因如下:

鉴于你知道ID的User对象,如ID是用户的属性。因此,你为什么需要Dictionary<User, Id>?如果你有Dictionary<Id, User>,你可以得到给定ID的用户,如果你有用户,你应该已经有了ID,这样就不需要其他字典了。

或者有时你有一个不完整的用户对象,并且没有填充ID?

+0

在某些时候,我知道用户(姓名和电子邮件),但不知道用户名,并且在某些时候我知道用户名,但不知道用户名和电子邮件地址。说得通? – DarthVader 2010-10-21 20:09:53

+0

在这种情况下,它听起来像你需要两个字典:一个在电子邮件上进行查找(如果电子邮件不是唯一的,则连接该名称),另一个在Id上查找。您不需要(或可能需要开销)将整个用户对象用作关键字。我倾向于只使用两本字典:简单而干净。您可以避免使用可以表示电子邮件或ID的密钥类型在字典中存储两次相同的对象,但我不明白您购买了什么。 – mtreit 2010-10-21 20:45:23

0

您可以轻松地创建两个字典,因为无论如何都通过引用存储条目。但正如其他人所说,如果您拥有包含该用户名的用户,则像您一样的接线永远不需要找到该用户名。

+0

是的,这很容易。我想我不能得到它与自定义比较.. – DarthVader 2010-10-21 20:10:22

0

我知道这个问题是旧的,但它提出了在谷歌搜索我只是做了,我很不满意最多的回答。我会建议使用Tuple作为字典中的关键字。如果姓名和电子邮件都是字符串,id是一个整数,那么它可能是一个元组

+1

你的答案应该包括示例代码。 – 2014-09-22 17:04:05