2009-05-02 18 views
2

Ich habe einige Code, der eine Hashtabelle mit einer Frage als Schlüssel und eine Arraylist der Antworten als Wert füllt.C# Foreach Loop Hashtable Problem

Ich möchte dann diese Werte aus der Hashtabelle ausdrucken, so dass es die Frage und die entsprechenden Lösungen für jede einzelne Frage in der Hashtabelle anzeigt.

Ich weiß, dass ich etwas völlig Dummes mit der Foreach-Schleife gemacht habe, um den Hashtable-Inhalt auszudrucken, aber ich habe gerade einige Stunden lang gecodiert und kann nicht an die Logik denken, meine verschachtelte Arraylist auszudrucken.

Hilfe sehr geschätzt. Hier

ist der 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()); 
      } 
     } 
+1

Sieht aus wie ein Duplikat . Bitte bestätigen und stimmen Sie ab. – dirkgently

Antwort

10

Wie Sie LINQ verwenden sind Sie offensichtlich nicht auf Rahmen beschränkt 1.1, so sollten Sie nicht die HashTable und ArrayList Klassen werden . Sie sollten stattdessen die streng typisierten Klassen Dictionary und List verwenden.

Sie brauchen keine Klasse, um die Frage und Antworten zu halten, wie Sie die Dictionary haben. Die Klasse wäre nur ein zusätzlicher Container ohne wirklichen Zweck.

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

Wenn Sie die Klasse aus einem anderen Grund benötigen, könnte das wie folgt aussehen.

(Beachten Sie, dass die Frage Zeichenfolge sowohl in der Klasse verwiesen wird und als Schlüssel im Wörterbuch verwendet, aber der Wörterbuch Schlüssel nicht wirklich für alles, was in diesem Code verwendet wird.)

//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); 
    } 
} 
+0

Fantastische Antwort, danke, ich denke, ich hätte wirklich nicht mit nicht-sicheren Lösungen in der ersten Ort. Danke – Goober

0

Sollte dies nicht:

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

das sein?

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

Versuchen Sie, diese

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

      } 
1

Minor Tweaks

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 
} 
+0

Error1: foreach-Anweisung kann nicht mit Variablen vom Typ 'Objekt' operieren, weil 'Objekt' keine öffentliche Definition für 'GetEnumerator – Jack

0

Zuerst wird ein stark typisierte generische Sammlung würde es einfacher machen. Lassen Sie uns durch Definieren eines Alias ​​für die stark typisierte Sammlung starten:

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

Von nun an MyHash die gleiche wie die langwierige allgemeine Definition bedeutet. Jetzt können Sie das hashtable Mitglied erklären wie:

static MyHash sourceList = new MyHash(); 

Und iterieren es mag:

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

Hoffnung dies nützlich.