Question

J'ai un code qui remplit une table de hachage avec une question comme clé et un arrayliste de réponses comme valeur.

Je souhaite ensuite imprimer ces valeurs à partir de la table de hachage afin qu'elle affiche la question et les solutions correspondantes pour chaque question individuelle dans la table de hachage.

Je sais que j'ai fait quelque chose de complètement stupide avec la boucle foreach pour imprimer le contenu de la table de hachage, mais cela fait déjà quelques heures que je code, et je n'arrive pas à penser à la logique pour imprimer mon liste imbriquée.

L’aide a été grandement appréciée.

Voici le code:

//Hashtable Declaration
static Hashtable sourceList = new Hashtable();    

//Class For Storing Question Information
public class QuestionAnswerClass
{
    public string simonQuestion;
    public ArrayList simonAnswer = new ArrayList();
}

//Foreach loop which populates a hashtable with results from
//a linq query that i need to print out.
foreach (var v in linqQueryResult)
        {
            Debug.WriteLine(v.question);
            newques.simonQuestion = v.question;
            //Debug.WriteLine(v.qtype);
            //newques.simonQType = v.qtype;

            foreach (var s in v.solution)
            {
                Debug.WriteLine(s.Answer);
                newques.simonAnswer.Add(s.Answer);
            }
        }          

        sourceList.Add(qTextInput,newques);

//foreach loop to print out contents of hashtable
foreach (string key in sourceList.Keys)
        {
            foreach(string value in sourceList.Values)
            {
                Debug.WriteLine(key);
                Debug.WriteLine(sourceList.Values.ToString());
            }
        }
Était-ce utile?

La solution

Comme vous utilisez LINQ, vous n'êtes évidemment pas contraint par le framework 1.1, vous ne devez donc pas utiliser les classes HashTable et ArrayList . Utilisez plutôt les classes Dictionary et List génériques strictement typées.

Vous n'avez pas besoin d'une classe pour conserver la question et les réponses car vous avez le dictionnaire . La classe ne serait qu'un conteneur supplémentaire sans véritable utilité.

//Dictionary declaration
static Dictionary<string, List<string>> sourceList = new Dictionary<string, List<string>>();

//Foreach loop which populates a Dictionary with results from
//a linq query that i need to print out.
foreach (var v in linqQueryResult) {
   List<string> answers = v.solution.Select(s => s.Answer).ToList();
   sourceList.Add(v.question, answers);
}          

//foreach loop to print out contents of Dictionary
foreach (KeyValuePair<string, List<string>> item in sourceList) {
   Debug.WriteLine(item.Key);
   foreach(string answer in item.Value) {
      Debug.WriteLine(answer);
   }
}

Si vous avez besoin du cours pour une autre raison, cela pourrait ressembler à ce qui suit.

(Notez que la chaîne de question est à la fois référencée dans la classe et utilisée comme clé dans le dictionnaire, mais la clé de dictionnaire n'est vraiment utilisée dans aucun élément de ce code.)

//Class For Storing Question Information
public class QuestionAnswers {

   public string Question { get; private set; }
   public List<string> Answers { get; private set; }

   public QuestionAnswers(string question, IEnumerable<string> answers) {
      Question = question;
      Answers = new List<string>(answers);
   }

}

//Dictionary declaration
static Dictionary<string, QuestionAnswers> sourceList = new Dictionary<string, QuestionAnswers>();

//Foreach loop which populates a Dictionary with results from
//a linq query that i need to print out.
foreach (var v in linqQueryResult) {
   QuestionAnswers qa = new QuestionAnswers(v.question, v.solution.Select(s => s.Answer));
   sourceList.Add(qa.Question, qa);
}          

//foreach loop to print out contents of Dictionary
foreach (QustionAnswers qa in sourceList.Values) {
   Debug.WriteLine(qa.Question);
   foreach(string answer in qa.Answers) {
      Debug.WriteLine(answer);
   }
}

Autres conseils

Essayez ceci

foreach (DictionaryEntry entry in sourceList)
            {
                Debug.WriteLine(entry.Key);
                foreach (object item in (ArrayList)entry.Value)
                {
                    Debug.WriteLine(item.ToString());
                }

            }

Réglages mineurs

foreach (string key in sourceList.Keys)
{
  Console.WriteLine(key);
  foreach(string value in sourceList[key])
  {
    Console.WriteLine("\t{0}", value);  // tab in answers one level
  }
  Console.WriteLine(); // separator between each set of q-n-a
}

Cela ne devrait-il pas:

Debug.WriteLine(sourceList.Values.ToString());

être-ce?

foreach(var obj in sourceList.Values)
    Debug.WriteLine(obj);

Premièrement, une collection générique fortement typée faciliterait les choses. Commençons par définir un alias pour la collection fortement typée:

using MyHash = System.Collections.Generic.Dictionary<string,
    System.Collections.Generic.List<string>>;

À partir de maintenant, MyHash signifie la même chose que la longue définition générique. Vous pouvez maintenant déclarer le membre hashtable comme suit:

static MyHash sourceList = new MyHash();

Et parcourez-le comme:

foreach (var pair in sourceList)
{
    var question = pair.Value;
    Console.WriteLine(question);
    foreach (var answer in pair.Value)
        Console.WriteLine("    " + answer);
}

J'espère que cela vous sera utile.

foreach (entrée DictionaryEntry dans Hashtable) {

}  Pour en savoir plus, consultez la http://www.dotnetperls.com/hashtable

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top