2

キーとしての質問と値としての回答の配列リストをハッシュテーブルに入力するコードがあります。

次に、ハッシュテーブルからこれらの値を出力して、ハッシュテーブル内の個々の質問ごとに質問と対応する解決策を表示したいと考えています。

ハッシュテーブルの内容を出力するために foreach ループでまったくばかげたことをしたことは知っていますが、数時間コーディングを続けていて、ネストされた配列リストを出力するロジックが思いつきません。

大変助かりました。

コードは次のとおりです。

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

6 に答える 6

10

HashTableLINQ を使用しているため、明らかにフレームワーク 1.1 に制約されていないため、 andArrayListクラスを使用しないでください。代わりに、厳密に型指定されたジェネリックDictionaryListクラスを使用する必要があります。

を持っているので、質問と回答を保持するためのクラスは必要ありません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);
   }
}
于 2009-05-02T17:45:42.007 に答える
2

これを試して

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

            }
于 2009-05-02T17:29:48.113 に答える
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
}
于 2009-05-02T17:30:40.517 に答える
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);
}

これがお役に立てば幸いです。

于 2009-05-02T18:20:56.433 に答える
0

foreach (Hashtable の DictionaryEntry エントリ) {

http://www.dotnetperls.com/hashtableで詳細を確認してください

于 2013-08-28T11:33:31.940 に答える
0

これはいけません:

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

これでしょうか?

foreach(var obj in sourceList.Values)
    Debug.WriteLine(obj);
于 2009-05-02T17:25:31.853 に答える