【问题标题】:C# Dictionary get item by indexC#字典按索引获取项目
【发布时间】:2017-03-17 16:15:42
【问题描述】:

我正在尝试创建一个从我的字典中返回卡片名称的方法 随机。

我的字典:第一个定义的卡片名称是字符串,第二个是该卡片的值,它是 int。

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”

任何人都可以帮助我如何正确地获得名称?

【问题讨论】:

  • 将随机值设为键不是更有意义吗?或者,对于像这样定义明确的集合,使用数组?

标签: c# dictionary key-value


【解决方案1】:

如果需要根据索引提取元素键,可以使用这个函数:

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

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

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

旁注:字典的第一个元素是键,第二个是值

【讨论】:

  • 即使有无限迭代,我认为当存在重复值时您也不会得到完全覆盖,他在他的示例中展示了这一点。它可能总是给出“第一个”(即使不能保证顺序......不过只是一个想法)。
  • 谢谢!这正是我要找的!我也试过 ElementAt,但我忘了使用 .Key
【解决方案2】:

您可以为每个索引获取键或值:

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

【讨论】:

  • 请务必使用 System.Linq 添加;到你的程序,因为这是一个 Linq 扩展方法。
  • 性能警告:字典没有有一种通过 ElementAt 快速访问第 n 个“元素”的方法。它对条目进行线性枚举,直到到达所需的元素。因此,每次调用 ElementAt 所花费的时间都会随着字典的大小而增加;性能是 O(n)。如果需要多次调用,并且您没有向字典中添加新条目,则构建 keyslist。然后,您可以在 O(1) 时间内从该列表中获取一个随机密钥。
【解决方案3】:

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

这里是示例

首先在你的类文件中添加 using

using System.Linq;

然后

yourDictionaryData.ElementAt(i).Key
yourDictionaryData.ElementAt(i).Value

希望这会有所帮助。

【讨论】:

  • 感谢您对using System.Linq; 的帮助
【解决方案4】:

你的键是一个字符串,你的值是一个整数。您的代码将不起作用,因为它无法查找您传递的随机 int。 另外,请提供完整代码

【讨论】:

    【解决方案5】:

    超越所提出的确切问题,寻找可能更适合需求的替代方案是否有用?创建您自己的类或结构,然后将它们组成一个数组以进行操作,而不是被 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);
    
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      相关资源
      最近更新 更多