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

BTW一年通常有一个多月。看起来你需要在这里查找,或者Dictionary<string, List<string>>存储一年中的所有月份。

解释通用字典Dictionary<TKey, TValue>实现IEnumerable接口,它返回一个遍历集合的枚举器。来自 msdn:

出于枚举的目的,字典中的每个项目都被视为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

你的设计是错误的。在字典中使用一对是没有意义的。您不需要使用字典列表。

试试这个:

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 回答