0
votes

Parcourir un dictionnaire en C #

J'ai le code suivant utilisant la classe et le dictionnaire qui prennent l'état et la majuscule, mais je ne peux pas récupérer les valeurs en boucle. J'ai besoin d'aide pour éliminer l'erreur qui se produit dans la boucle foreach .

 var theState= State.GetStates();

 // this prints one item in a dictionary

 Console.WriteLine("State Capital of California is " +   theState["California"].Capital);

foreach (KeyValuePair<string,object> entry in theState)
{
    Console.WriteLine(entry.Key + " State Capital  is " +  entry.Value.ToString());
}

et mon programme principal est le suivant .. Mais j'obtiens une erreur ..

public class State {
  public string Capital { get; set; }
  public int Population { get; set; }
  public int Size { get; set; }

  public State(string aCapital, int aPopulation, int aSize) {
    Capital = aCapital;
    Population = aPopulation;
    Size = aSize;
  } // Constructor of the class State

  public static Dictionary<string, State> GetStates() {
    Dictionary<string, State> myStates = new Dictionary<string, State>(); // need the () because its a class

    // myStates takes 2 values, one is a string , that is a state and State ,  which is inturn takes 3 values - 
    // Capital,Population, size

    State addStateCapital = new State("Montgomery", 214141, 244);
    myStates.Add("Alabama", addStateCapital);
    // second set
    addStateCapital = new State("Sacramento", 214141, 244);
    myStates.Add("California", addStateCapital);

    return myStates;
  }
}

ERREUR sur foreach :

Impossible de convertir keyvaluePair en System ... Generic KVP

Besoin d'aide pour comprendre comment récupérer correctement les valeurs.


1 commentaires

Il vous indique l'erreur dans le message d'erreur; vous essayez de convertir un KeyValuePair en un KeyValuePair . Je suggère d'utiliser simplement foreach (var entry in theState) .


3 Réponses :


0
votes

1) Utilisez State au lieu de Object dans KeyValuePair . Puisque vous avez déjà spécifié dans State.GetStates () le type de retour a

foreach (KeyValuePair<string,State> entry in theState)
 {
 Console.WriteLine(entry.Key + " State Capital  is " +  entry.Value.Capital);
 }

2) Modifiez également entry.Value.ToString () en entry.Value.Capital strong >. Puisqu'il n'affichera pas le nom de l'état mais le nom de l'objet de classe. Par conséquent, changez-le entry.Value.Capital

 Dictionary<string, State>


1 commentaires

@VajraAyudha me fait savoir comment cela se passe pour vous.



1
votes

Votre méthode GetStates () renvoie Dictionary , donc dans cette ligne

 foreach (KeyValuePair<string, State> entry in theState)
 {
      Console.WriteLine(entry.Key + " State Capital  is " +  entry.Value.Capital);
 }

la variable theState est affecté au type Dictionary . Mais dans le bloc foreach suivant, vous essayez d'accéder aux valeurs du dictionnaire en tant que KeyValuePair .

Vous devez donc l'utiliser comme ceci:

var theState= State.GetStates();


0 commentaires

0
votes

Changer l'extrait de code ci-dessous résoudra votre problème

foreach (KeyValuePair<string, State> entry in theState)
 {
      Console.WriteLine(entry.Key + " State Capital  is " +  entry.Value.Capital);
 }

Mais pour comprendre pourquoi vous obtenez cette erreur, vous voudrez peut-être examiner de plus près la définition de Dictionary qui est dérivé de IEnumerable > . Ainsi, lorsque vous utilisez la boucle foreach, elle agit en interne sur IEnumerable > . Ici, le compilateur s'attend à ce que chaque entité de foreach soit de type KeyValuePair . Maintenant que dans le dictionnaire, vous avez TValue est de type State qui explique pourquoi le compilateur attend KeyValuePair . Maintenant, pour avoir une compréhension approfondie à ce sujet, vous voudrez peut-être passer par les "concepts covariants et contravariants c #"


0 commentaires