Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字典的多键查找_C#_.net_Collections_Dictionary_Comparison - Fatal编程技术网

C# 字典的多键查找

C# 字典的多键查找,c#,.net,collections,dictionary,comparison,C#,.net,Collections,Dictionary,Comparison,我正在解析一个文件,我想将其存储在一个查找结构中,以便使用两个键进行查找 我有一个用户实体,它有名称、电子邮件和id,类型不相关 我想把它存储在字典中,这样我可以通过查找user来获取用户id 我也想要另一种方法,即:Dictionary 我可以创建两个结构并进行查找。那很容易。我想用一个单一的结构 我很好奇我是否可以用一个单一的结构来做这件事 我在想我能做到: Dictionary,然后实现一个IEqualityComparer 有更好的方法吗 实现IEqualityComparer的最佳实践

我正在解析一个文件,我想将其存储在一个查找结构中,以便使用两个键进行查找

我有一个
用户实体
,它有
名称、电子邮件
id
,类型不相关

我想把它存储在
字典中
,这样我可以通过查找user来获取用户id

我也想要另一种方法,即:
Dictionary

我可以创建两个结构并进行查找。那很容易。我想用一个单一的结构

我很好奇我是否可以用一个单一的结构来做这件事

我在想我能做到:

Dictionary
,然后实现一个
IEqualityComparer

有更好的方法吗


实现IEqualityComparer的最佳实践是什么?

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

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

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


或者有时您的用户对象不完整,Id未填充?

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

无论您是否需要进行这种类型的映射,您都可以使用一个字典来查找您想要的内容。以下是一个粗略的示例:

var dict = new Dictionary<string, object>();
dict["ID_001"] = new User();
dict["USER_??"] = 001; // Need a unique user string to replace the "??"
var dict=newdictionary();
dict[“ID_001”]=新用户();
dict[“用户”]=001;//需要唯一的用户字符串来替换“?”
当然,你可以编任何你想要的字符串。如果您希望围绕对象包装函数,那么可以避免每次获取项目时都必须强制转换对象。(静态方法可能更适合您。)

User GetUser(int-id,Dictionary-dict)
{
返回(用户)dict[“ID_”+ID];
}

我知道这个问题很老了,但我刚在谷歌搜索时发现了这个问题,我对上面的答案不满意。我建议使用Tuple作为字典的索引。如果name和email是字符串,id是int,那么它可以是一个元组

,因为id是用户对象上的一个属性,当您想从特定对象获取id时,只需执行User.id。但我猜即使身份证不是公开的,你也想做相反的事?我想你不明白我问的是什么。我可以将用户对象存储为键,然后我不能仅通过id进行查找。是的,我可以存储它。在某些时候,我知道用户{name and email}但不知道Id,在某些时候我知道用户Id但不知道用户{name and email}。有意义吗?在这种情况下,听起来您需要两个字典:一个用于查找电子邮件(如果电子邮件不是唯一的,也可以连接名称),另一个用于查找Id。您不需要(或可能需要)将整个用户对象用作密钥。我倾向于只使用两本字典:简单明了。你可以使用一个可以表示电子邮件或id的键类型在字典中存储同一个对象两次,但我看不出这能给你带来什么。这很聪明,应该有用。不硬编码任何字符串怎么样?@user177883:那么,你最终基本上会得到一本字典,这可能不值得。
User GetUser(int id, Dictionary<string, object> dict) 
{
    return (User)dict["ID_" + id];
}