C#-woordenboek item op index ophalen

Ik probeer een methode te maken die een naam van een kaart uit mijn Woordenboek retourneert
willekeurig.

Mijn woordenboek: de eerst gedefinieerde naam van de kaart is string en de tweede is de waarde van die kaart, die int is.

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 }
    };

Methode:
randomis een willekeurig gegenereerde int.

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

Het probleem is dus:

Kan niet converteren van ‘int’ naar ‘string’

Iemand helpt me hoe ik het goed moet doen om de naam te krijgen?


Antwoord 1, autoriteit 100%

Als u een elementsleutel moet extraheren op basis van een index, kan deze functie worden gebruikt:

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

Als u de sleutel moet extraheren waarbij de elementwaarde gelijk is aan het willekeurig gegenereerde gehele getal, kunt u de volgende functie gebruiken:

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

Zorg ervoor dat je een verwijzing naar System.Linqin je klas hebt toegevoegd.

using System.Linq;

Kanttekening: het eerste element van het woordenboek is de sleutel en het tweede is de waarde


Antwoord 2, autoriteit 53%

U kunt sleutels of waarden per index nemen:

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

Antwoord 3, autoriteit 16%

u kunt eenvoudig toegang krijgen tot elementen via index , door gebruik te maken van System.Linq

Hier is het voorbeeld

Voeg eerst gebruik toe in je klasbestand

using System.Linq;

Dan

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

Hopelijk helpt dit.


Antwoord 4, autoriteit 4%

Uw sleutel is een tekenreeks en uw waarde is een int. Je code werkt niet omdat hij de willekeurige int die je doorgeeft niet kan opzoeken.
Geef ook de volledige code op


Antwoord 5

Is het nuttig om verder te kijken dan de exacte vraag die wordt gesteld naar alternatieven die mogelijk beter aansluiten bij de behoefte? Maak je eigen klasse of struct en maak er vervolgens een array van om op te werken in plaats van vast te zitten aan de bewerking van het KeyValuePair-verzamelingsgedrag van het Dictionary-type.

Als je een struct gebruikt in plaats van een klasse, kun je twee verschillende kaarten op gelijkheid vergelijken zonder je eigen vergelijkingscode te implementeren.

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);
}

Other episodes