2

一半的时间我需要根据字符串,他们的名字来找到一个值,而另一半我需要根据一个 int,他们的用户 ID 来找到一个值。

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

    public static Dictionary<int, Player> nPlayers = new Dictionary<int, Player>();
    public static Dictionary<string, Player> sPlayers = new Dictionary<string, Player>();

在扫描了其他问题后,有人提到使用字典。如果有人可以详细说明这一点(如果这是我正在寻找的解决方案),那就太好了

我对元组知之甚少,但据我所知,它需要两个键,而我正在寻找的需要一个或另一个。

Dictionary<object, Player>做的伎俩?我不知道。

请在我狭隘的编码经验中帮助我。;_;

4

4 回答 4

1

我不认为拥有一个Dictionary<object,Player>比拥有两个不同的字典更好的主意。它可能会占用相同数量的内存(因为每个Player引用仍将在统一字典中存储两次),可能不太清晰,并且可能(可以想象)导致哈希码冲突问题,因为您的密钥可以是几种不同的类型。

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

于 2012-05-29T17:52:38.083 回答
1

您想知道将来放入 Dictionary 中的原始数据类型吗?如果没有,您有两种选择:

  1. 字符串输入!- 只需使用 astring作为键,添加时,调用.ToString()整数 :)

  2. Be objective - 使用 anobject作为键,这样你就可以在里面放任何你喜欢的东西。

基于 2,我推荐第一个,因为你仍然有某种类型的限制。

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

于 2012-05-29T17:52:57.630 回答
1

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

于 2012-05-29T17:54:25.967 回答
1

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

我认为你可以用另一种方式做到这一点,

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

这只是你需要的,在他们登录时添加玩家。

如果您想通过 ID、Name 或任何您可以查询 nPlayers 并找到 Player 的内容进行搜索。

 var playerByID = nPlayers.Where(p= p.ID==givenID).FirstOrDefault();

 var playerByName = nPlayers.Where(p= p.Name==givenName).FirstOrDefault();
于 2012-05-29T18:27:41.610 回答