C# 字典中键的多个选项?

C# 字典中键的多个选项?,c#,.net,dictionary,C#,.net,Dictionary,一半的时间我需要根据字符串及其名称查找值,另一半时间我需要根据int及其用户ID查找值 目前我有两个字典来解决这个难题——一个使用字符串作为键,另一个使用int作为键。我想知道是否有更有效的方法来实现这一点-一种基于int或string获取值的方法 在浏览了其他问题之后,有人提到使用了一本词典。如果有人能详细说明这一点,如果这是我正在寻找的解决方案,那就太好了 我对元组知之甚少,但据我所知,它需要两个键,而我要寻找的是其中之一 字典会起作用吗?我不知道 请帮助我了解我狭隘的编码经验 我不认为拥有

一半的时间我需要根据字符串及其名称查找值,另一半时间我需要根据int及其用户ID查找值

目前我有两个字典来解决这个难题——一个使用字符串作为键,另一个使用int作为键。我想知道是否有更有效的方法来实现这一点-一种基于int或string获取值的方法

在浏览了其他问题之后,有人提到使用了一本词典。如果有人能详细说明这一点,如果这是我正在寻找的解决方案,那就太好了

我对元组知之甚少,但据我所知,它需要两个键,而我要寻找的是其中之一

字典会起作用吗?我不知道

请帮助我了解我狭隘的编码经验

我不认为拥有一本字典比拥有两本不同的字典更好。它可能需要相同的内存量,因为每个播放器引用仍将在统一字典中存储两次,可能不太清晰,并且可能会导致哈希代码冲突问题,因为您的密钥可以是几种不同的类型

我会保留两本字典,PlayersByName和PlayersByID,并在适当的时候使用它们。

我不认为拥有一本字典比拥有两本不同的字典更好。它可能需要相同的内存量,因为每个播放器引用仍将在统一字典中存储两次,可能不太清晰,并且可能会导致哈希代码冲突问题,因为您的密钥可以是几种不同的类型


我会保留两个字典,PlayersByName和PlayersByID,并在适当的时候使用它们。

您想知道将来放在字典中的原始数据类型吗?如果没有,您有两个选择:

严格打字!-只需使用字符串作为键,在向其添加时,对整数调用.ToString:

客观一点——用一个物体作为钥匙,这样你就可以在里面放任何你喜欢的东西

基于2,我推荐第一个,因为这里仍然有一些类型限制


如果您确实希望将来知道原始数据类型-您的实现很好:

您希望将来知道字典中的原始数据类型吗?如果没有,您有两个选择:

严格打字!-只需使用字符串作为键,在向其添加时,对整数调用.ToString:

客观一点——用一个物体作为钥匙,这样你就可以在里面放任何你喜欢的东西

基于2,我推荐第一个,因为这里仍然有一些类型限制


如果您将来确实想知道原始数据类型,您的实现很好:

您的解决方案2字典是正确的。字典只能由一个稳定键索引。因此,您必须保留单独的字典,以便通过不同的键进行索引。

您的解决方案2字典是正确的。字典只能由一个稳定键索引。因此,您必须保留单独的词典,以便通过不同的键进行索引。

根据用户登录系统时的注释,如果您将它们添加到词典中,则必须在此处将它们添加到两个词典中

我想你可以用另一种方式

   public static List<Player> nPlayers = new List<Player>();

根据用户登录系统时的评论,您可以将它们添加到词典中,这里您必须将它们添加到两个词典中

我想你可以用另一种方式

   public static List<Player> nPlayers = new List<Player>();

把它包装在一个容器类中:两个不同的字典更好,但是为什么你在这里保留字典,你的玩家对象中不能有用户id和名称的属性吗?这些值得一看:Damith:是的,玩家对象包含他们的用户id和名称,但是我需要一种有条理的方式来了解每个登录的人。可能重复的方法是将其包装在一个容器类中:两个不同的字典更好,但是为什么要将字典保存在这里,你的玩家对象中不能有用户名和名称的属性吗?这些值得一看:Damith:是的,玩家对象包含他们的用户ID和姓名,但我需要一种有组织的方式来了解每个登录的人。我不认为可能是重复的。哪里是合法查询。我将使用列表,当我需要搜索它时,我将使用foreach循环。最好你尝试一下,看看:如果你不知道我不思考,你可以学习一些东西。哪里有法律查询。我将使用列表,当我需要搜索它时,我将使用foreach循环。最好尝试一下,看看:如果你不知道,你可以学习一些东西
 var playerByID = nPlayers.Where(p= p.ID==givenID).FirstOrDefault();

 var playerByName = nPlayers.Where(p= p.Name==givenName).FirstOrDefault();