2009-05-02 5 views
2

У меня есть код, который заполняет хэш-таблицу с вопросом в качестве ключа и администратором ответов в качестве значения.C# Foreach Loop Hashtable Issue

Я хочу затем распечатать эти значения из хеш-таблицы, чтобы он отображал вопрос и соответствующие решения для каждого отдельного вопроса в хэш-таблице.

Я знаю, что я сделал что-то совершенно глупое с циклом foreach, чтобы распечатать содержимое хэш-таблицы, но я кодировал несколько часов на несколько часов, и я не могу придумать логику для распечатки моего вложенного arraylist.

Помогите оценить очень.

Вот код:

//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

Похоже дубликата . Пожалуйста, подтвердите и проголосуйте за закрытие. – dirkgently

ответ

10

Как вы используете LINQ вы, очевидно, не ограничены в рамках 1.1, так что вы не должны использовать HashTable и ArrayList классы , Вместо этого вы должны использовать строго типизированные общие классы Dictionary и List.

Вам не нужен класс, чтобы держать вопрос и отвечать, как у вас есть Dictionary. Класс был бы только дополнительным контейнером без реальной цели.

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

Если вам нужен класс по другой причине, это может выглядеть как показано ниже.

(Обратите внимание, что строка вопрос как ссылка в классе и используется в качестве ключа в словаре, но ключ словаря является на самом деле не используется ни для чего в этом коде.)

//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

Фантастический ответ, спасибо, я думаю, я действительно не должен был беспокоиться о небезопасных решениях в первом место. Thankyou – Goober

0

Не следует так:

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

быть это?

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

Попробуйте

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

      } 
1

Незначительные щипки

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 не может работать с переменными типа «объект», потому что «объект» не содержит общедоступного определения для «GetEnumerator» – Jack

0

Во-первых, строго типизированная общая коллекция облегчила бы ее. Давайте начнем с определения псевдонима для строго типизированных коллекции:

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

Отныне MyHash означает то же самое, как затянувшегося общего определения. Теперь вы можете объявить Хеш элемент как:

static MyHash sourceList = new MyHash(); 

И перебирать ему нравится:

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

Надеется, что это полезно.