我正在解析一个文件,我希望以一种可以用两个键查找的方式将它存储在查找结构中。
我的User Entity
有name, email
和id
,类型无关紧要。
我想将其存储在Dictionary<User, id>
中,以便通过查找用户来获取用户ID。
我也想要反过来,即:Dictionary<Id, User>
我可以创建两个结构并进行查找。这很简单。我想用一个结构来做。
我很好奇我是否可以使用单一结构
我在想我能做到:
Dictionary<User, User>
,然后实施IEqualityComparer<User>
有更好的方法吗?
实现IEqualityComparer的最佳做法是什么?
答案 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,那么它可能是一个元组