Frage

Ich habe einige code füllt eine hashtable mit einer Frage als Schlüssel und eine arraylist Antworten als Wert.

Ich möchte, dann drucken Sie sich diese Werte aus der hashtable, so dass es zeigt die Frage und die entsprechenden Lösungen für jede einzelne Frage in der Hashtabelle.

Ich weiß, ich habe etwas getan, der völlig dumm mit der foreach-Schleife zum Ausdruck der hashtable-Inhalte, aber ich habe Kodierung für ein paar Stunden gerade, und ich kann nicht denken von der Logik Ausdruck meiner verschachtelten arraylist.

Hilfe zu schätzen wusste.

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());
            }
        }
War es hilfreich?

Lösung

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

Sie brauchen keine Klasse, um die Fragen und Antworten in halten, wie Sie die Dictionary haben. Die Klasse würde nur ein zusätzlicher Behälter ohne wirklichen Zweck sein.

//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 Grunde brauchen, das wie folgt aussehen könnte.

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

Andere Tipps

Versuchen Sie, diese

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

            }

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
}

Sollte das nicht:

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

das sein?

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

Erste, eine stark typisierte generische Sammlung, die es erleichtern würde.Beginnen wir mit der Definition eines alias für die stark typisierte Sammlung:

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

Von jetzt auf, MyHash bedeutet das gleiche wie die langen generische definition.Jetzt können Sie erklären die hashtable-Mitglied wie:

static MyHash sourceList = new MyHash();

Und Durchlaufen Sie wie:

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

Hoffe, dies ist nützlich.

foreach (Dictionary Eintrag in Hashtable) {

}  Finden Sie mehr in http://www.dotnetperls.com/hashtable

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top