我有一个快速的问题。在C#中,是否有一种简单的方法可以通过for
语句轻松循环遍历System.Collections.Generic.Dictionary
?
谢谢提前。
Dictionary<string,string> dictionary = new Dictionary<string,string>();
// ...
foreach (KeyValuePair<string,string> kv in dictionary)
{
string key = kv.Key;
string value = kv.Value;
}
没有合理的方法,不行。您可以使用Linq扩展ElementAt
:
for (int i = 0; i < dictionary.Keys.Count; i++)
{
Console.WriteLine(dictionary.ElementAt(i).Value);
}
...但我真的看不出有什么意义。只需使用常规的foreach
方法即可。如果您因某种原因需要在迭代时跟踪索引,可以在“旁边”完成:
int index = 0;
foreach (var item in dictionary)
{
Console.WriteLine(string.Format("[{0}] - {1}", index, item.Value));
// increment the index
index++;
}
foreach(var key in myDictionary.Keys)
foreach(var value in myDic.Values)
遍历键值对:
foreach(KeyValuePair<K, V> p in myDic)
{
var key = p.Key;
var value = p.Value
}
var enumerator = d.GetEnumerator();
while (enumerator.MoveNext())
{
var pair = enumerator.Current;
b += pair.Value;
}
enumerator.Dispose();
来自C# 字典 GetEnumerator的代码片段
foreach
更好,它正是foreach
要做的事情。foreach
只是这个的语法糖(除了foreach
会正确地执行,而不像你的代码)。foreach
不会更慢;它正在做同样的事情。 - Servy菲利普已经掌握了foreach
,虽然我通常会简化为:
foreach (var pair in dictionary)
{
var key = pair.Key;
var value = pair.Value;
}
无法使用for
循环遍历这个键值对集合,因为它们没有按顺序存储。但你可以将键或值作为集合进行遍历。
var
关键字绝对是必不可少的。此外,在这种情况下,提问者没有指定字典上的通用类型,我发现(在现实世界中)有时需要更改类型。我的var
使用使得字典的确切类型无关紧要,并且是适用于任何通用类型的代码。有很多地方我不会让var
通过代码审查,但在示例片段中,它是可以接受的。 - Keith当然可以做到,但在我看来有点傻
Dictionary<string,string> dictionary = new Dictionary<string, string>();
Dictionary<string, string>.Enumerator enumerator = dictionary.GetEnumerator();
for (int i = 0; i < attributeValues.Count;i++ )
{
KeyValuePair<string, string> current = enumerator.Current;
//do something usefull
enumerator.MoveNext();
}
这样做唯一得到的是一个(相当无用的)索引,如果这是实际目标,最好使用类似这样的东西:
int currentIndex = 0;
foreach (KeyValuePair<string, string> keyValuePair in dictionary)
{
//do something usefull
currentIndex++;
}
for
主要用于带有索引的集合。但是你可以很容易地使用 foreach
进行遍历。如果您正在使用3.5或更高版本的Net,则可以使用LINQ和谓词来定位特定的值或值。 字典不一定按顺序存储其KeyValue对(无论是按条目顺序还是按键顺序)。
你可以循环遍历键值
for(int i = 0; i < myDictionary.Keys.Length; ++i)
myDictionary.Keys[i] ...
或者这些数值
for(int i = 0; i < myDictionary.Values.Length; ++i)
myDictionary.Values[i] ...
或者像菲利普所展示的那样两者都可以
Count
,尝试通过索引(Keys[i]
)访问Keys
集合中的元素仍然会导致构建失败(这就是我在评论中提到的错误)。 - Fredrik Mörk