4

私は次のコードを持っています:

List<Dictionary<string, string>> allMonthsList = new List<Dictionary<string, string>>();
while (getAllMonthsReader.Read()) {
    Dictionary<string, string> month = new Dictionary<string, string>();
    month.Add(getAllMonthsReader["year"].ToString(),
    getAllMonthsReader["month"].ToString());
    allMonthsList.Add(month);
}
getAllMonthsReader.Close();

今、私は次のようにすべての月をループしようとしています:

foreach (Dictionary<string, string> allMonths in allMonthsList)

キー値にアクセスするにはどうすればよいですか? 私は何か間違ったことをしていますか?

4

3 に答える 3

15
foreach (Dictionary<string, string> allMonths in allMonthsList)
{
    foreach(KeyValuePair<string, string> kvp in allMonths)
     {
         string year = kvp.Key;
         string month = kvp.Value;
     }
}

ところで、年は通常 1 か月以上あります。Dictionary<string, List<string>>ここで、または年のすべての月を保存するためにルックアップが必要なようです。

説明一般的なディクショナリは、コレクションを反復処理する列挙子を返すインターフェイスをDictionary<TKey, TValue>実装しています。IEnumerablemsdn から:

KeyValuePair<TKey, TValue>列挙のために、ディクショナリ内の各項目は、値とそのキーを表す構造体として扱われます。アイテムが返される順序は定義されていません。

C# 言語の foreach ステートメントには、コレクション内の各要素の型が必要です。はキーと値のコレクションであるためDictionary<TKey, TValue>、要素の型はキーの型でも値の型でもありません。代わりに、要素の型はKeyValuePair<TKey, TValue>キー型と値型です。

于 2012-12-05T08:06:31.360 に答える
3
var months = allMonthsList.SelectMany(x => x.Keys);

IEnumerable<string>その後、必要に応じて、すべてのキーの単純な列挙を繰り返すことができます。

于 2012-12-05T08:07:19.063 に答える
1

あなたのデザインは間違っています。辞書で 1 つのペアを使用しても意味がありません。辞書のリストを使用する必要はありません。

これを試して:

class YearMonth
{
    public string Year { get; set; }
    public string Month { get; set; }
}

List<YearMonth> allMonths = List<YearMonth>();
while (getAllMonthsReader.Read())
{
     allMonths.Add(new List<YearMonth> {
                            Year = getAllMonthsReader["year"].ToString(),
                            Month = getAllMonthsReader["month"].ToString()
                                        });
}

getAllMonthsReader.Close();

使用:

foreach (var yearMonth in allMonths)
{
   Console.WriteLine("Year is {0}, Month is {1}", yearMonth.Year, yearMonth.Month);
}

または、.Net Framework 4.0 以降を使用している場合は、Tuple を使用できます

List<Tuple<string, string>> allMonths = List<Tuple<string, string>>();
while (getAllMonthsReader.Read())
{
     allMonths.Add(Tuple.Create( getAllMonthsReader["year"].ToString(),
                                 getAllMonthsReader["month"].ToString())
                  );
}

getAllMonthsReader.Close();

次に使用します。

foreach (var yearMonth in allMonths)
{
   Console.WriteLine("Year is {0}, Month is {1}", yearMonth.Item1, yearMonth.Item2);
}
于 2012-12-05T08:32:36.523 に答える