我有以下代码:
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)
如何访问键值?我做错了吗?
答案 0 :(得分:11)
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>
类型和值类型。
答案 1 :(得分:3)
var months = allMonthsList.SelectMany(x => x.Keys);
然后,您可以根据需要遍历IEnumerable<string>
,这是对所有密钥的简单枚举。
答案 2 :(得分: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);
}