Проблема с хэш-таблицей цикла C# Foreach
Вопрос
У меня есть некоторый код, который заполняет хэш-таблицу вопросом в качестве ключа и массивом ответов в качестве значения.
Затем я хочу распечатать эти значения из хэш-таблицы, чтобы в ней отображался вопрос и соответствующие решения для каждого отдельного вопроса в хэш-таблице.
Я знаю, что сделал что-то совершенно глупое с циклом 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());
}
}
Решение
Поскольку вы используете LINQ, вы, очевидно, не ограничены каркасом 1.1, поэтому не следует использовать классы HashTable
и ArrayList
. Вместо этого следует использовать строго типизированные универсальные классы Dictionary
и List
.
Вам не нужен класс для хранения вопросов и ответов, поскольку у вас есть словарь
. Класс будет только дополнительным контейнером без реальной цели.
//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);
}
}
Другие советы
Попробуйте это
foreach (DictionaryEntry entry in sourceList)
{
Debug.WriteLine(entry.Key);
foreach (object item in (ArrayList)entry.Value)
{
Debug.WriteLine(item.ToString());
}
}
Незначительные изменения
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
}
Не должно ли это:
Debug.WriteLine(sourceList.Values.ToString());
быть этим?
foreach(var obj in sourceList.Values)
Debug.WriteLine(obj);
Во-первых, строго типизированная универсальная коллекция облегчит задачу. Давайте начнем с определения псевдонима для строго типизированной коллекции:
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);
}
Надеюсь, это полезно.
foreach (запись словарного запаса в хэш-таблице) {
} Подробнее читайте в http://www.dotnetperls.com/hashtable