Dictionary的多键查找

时间:2010-10-21 20:00:26

标签: c# .net collections dictionary comparison

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

我的User Entityname, emailid,类型无关紧要。

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

我也想要反过来,即:Dictionary<Id, User>

我可以创建两个结构并进行查找。这很简单。我想用一个结构来做。

我很好奇我是否可以使用单一结构

我在想我能做到:

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

有更好的方法吗?

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

5 个答案:

答案 0 :(得分:1)

由于以下原因,我不确定您的问题描述是否有意义:

给定User对象,您知道ID,因为ID是用户的属性。因此,为什么你需要Dictionary<User, Id>?如果你有Dictionary<Id, User>,你可以找到给定Id的用户,如果你有用户,你应该已经有了ID,那就不需要另一个字典了。

或者有时候你有一个不完整的用户对象而且没有填充身份证?

答案 1 :(得分: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];
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以轻松创建两个词典,因为条目无论如何都是通过引用存储的。但正如其他人所说的那样,如果您的用户包含id,您将永远不需要找到ID。

答案 4 :(得分:0)

我知道这个问题已经过时了,但是我刚刚进行了Google搜索,我对顶级答案感到不满意。我建议使用Tuple作为词典的关键。如果name和email是字符串,而id是int,那么它可能是一个元组