C#通过索引获取Dictionary项

88
我正在尝试创建一个方法,该方法从我的字典中随机返回一张卡的名称。
我的字典: 卡的第一个定义名称是字符串,第二个则是它的值,是整数。
public static Dictionary<string, int> _dict = new Dictionary<string, int>()
    {
        {"7", 7 },
        {"8", 8 },
        {"9", 9 },
        {"10", 10 },
        {"J", 1 },
        {"Q", 1 },
        {"K", 2 },
        {"A", 11 }
    };

方法: random 是一个随机生成的整数。

    public string getCard(int random)
    {
        return Karta._dict(random);
    }

所以问题是:

无法将“int”转换为“string”

有没有人能帮我正确地获取名称?


1
把随机值作为键是否更有意义?或者对于这样一个明确定义的集合,使用数组? - FreeText
5个回答

124
如果您需要根据索引提取元素键,可以使用此函数:
public string getCard(int random)
{
    return Karta._dict.ElementAt(random).Key;
}

如果您需要提取元素值等于随机生成的整数的键,则可以使用以下函数:

public string getCard(int random)
{
    return Karta._dict.FirstOrDefault(x => x.Value == random).Key;
}

请确保在您的类中添加了对System.Linq的引用。

using System.Linq;

附注:字典的第一个元素是键(Key),第二个元素是值(Value)


1
即使进行无限次迭代,当存在重复值时,我认为您也无法获得完全覆盖,正如他在示例中展示的那样。它可能总是给出“第一个”(尽管顺序不能保证..只是一种想法)。 - Quantic
2
谢谢!这正是我在寻找的!我也尝试使用ElementAt,但我忘记使用.Key了。 - Jakub Staněk

61

您可以按索引获取键或值:

int value = _dict.Values.ElementAt(5);//ElementAt value should be <= _dict.Count - 1
string key = _dict.Keys.ElementAt(5);//ElementAt value should be  < =_dict.Count - 1

7
请确保在你的程序中添加 "using System.Linq;",因为这是一个 Linq 扩展方法。 - Anton Voronin
18
性能注意事项:字典没有快速访问第n个“元素”的途径,不能通过ElementAt直接访问。它需要对所有条目进行线性枚举,直到找到所需的元素。因此,每次调用ElementAt所需的时间随着字典大小的增加而增加;性能为O(n)。如果需要多次调用,并且不会向字典添加新条目,则建立一个列表。然后,您可以从该列表中以O(1)的时间获取一个随机键。 - ToolmakerSteve

18

通过使用System.Linq,您可以轻松地按索引访问元素。

以下是示例:

首先在您的类文件中添加using语句。

using System.Linq;

那么

yourDictionaryData.ElementAt(i).Key
yourDictionaryData.ElementAt(i).Value
希望这能有所帮助。

1
谢谢你提醒我使用 using System.Linq;,这很有帮助。 - 0dminnimda

3

你的键是一个字符串,值是一个整数。你的代码不能工作,因为它无法查找你传递的随机整数。 此外,请提供完整的代码。


2

在寻找更好的解决方案的时候,超越准确的问题有帮助吗?可以创建自己的类或结构体,然后创建一个该类型的数组来操作,而不是被限制于Dictionary类型的KeyValuePair集合行为。

使用结构体而不是类将允许比较两张不同的卡片而无需实现自己的比较代码。

public struct Card
{
  public string Name;
  public int Value;

}

private int random()
{
  // Whatever
  return 1;
}

private static Card[] Cards = new Card[]
{
    new Card() { Name = "7", Value = 7 },
    new Card() { Name = "8", Value = 8 },
    new Card() { Name = "9", Value = 9 },
    new Card() { Name = "10", Value = 10 },
    new Card() { Name = "J", Value = 1 },
    new Card() { Name = "Q", Value = 1 },
    new Card() { Name = "K", Value = 1 },
    new Card() { Name = "A", Value = 1 }
};

private void CardDemo()
{
  int value, maxVal;
  string name;
  Card card, card2;
  List<Card> lowCards;

  value = Cards[random()].Value;
  name = Cards[random()].Name;
  card = Cards[random()];
  card2 = Cards[1];
  // card.Equals(card2) returns true
  lowCards = Cards.Where(x => x.Value == 1).ToList();
  maxVal = Cards.Max(x => x.Value);

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接