任何人都可以帮助我理解为什么下面两个for loops
的输出会产生不同的输出吗?
我的眼睛是相同的,但原始的Dictionary
对象的for loop
会输出其所有9个成员,但Queue
个对象for loop
仅输出前5个
void test()
{
Dictionary<int, string> d = new Dictionary<int, string>();
d.Add(0, "http://example.com/1.html");
d.Add(1, "http://example.com/2.html");
d.Add(2, "http://example.com/3.html");
d.Add(3, "http://example.com/4.html");
d.Add(4, "http://example.com/5.html");
d.Add(5, "http://example.com/6.html");
d.Add(6, "http://example.com/7.html");
d.Add(7, "http://example.com/8.html");
d.Add(8, "http://example.com/9.html");
Queue<KeyValuePair<int, string>> requestQueue = new Queue<KeyValuePair<int, string>>();
// build queue
foreach (KeyValuePair<int, string> dictionaryListItem in d)
{
requestQueue.Enqueue(dictionaryListItem);
Console.WriteLine(dictionaryListItem.Value);
}
Console.WriteLine(" ");
for (int i = 0; i < requestQueue.Count; i++)
{
Console.WriteLine(requestQueue.Peek().Value);
requestQueue.Dequeue();
}
}
答案 0 :(得分:6)
你需要在循环之前保存计数:
var count = requestQueue.Count;
for (int i = 0; i < count; i++)
{
Console.WriteLine(requestQueue.Peek().Value);
requestQueue.Dequeue();
}
原因是它在for循环的每次迭代中被评估:
在第一次迭代开始时,requestQueue.Count
为9,i
为0
。
第二次迭代:requestQueue.Count
为8,i
为1
第3次迭代:requestQueue.Count
为7,i
为2
第4次迭代:requestQueue.Count
为6,i
为3
第5次迭代:requestQueue.Count
为5,i
为4
第6次迭代:requestQueue.Count
为4,i
为5
。 - &GT;退出循环。
注意:每次迭代都会减少队列的Count
,因为Queue.Dequeue
会删除队列中的第一项并将其返回给调用者。
答案 1 :(得分:3)
您可能希望使用此while-loop
代替更有意义的内容:
while (requestQueue.Count > 0)
{
Console.WriteLine(requestQueue.Peek().Value);
requestQueue.Dequeue();
}
for-loop
的问题在于Queue.Dequeue
删除了第一项,这也减少了Count
属性。这就是它停止“分道扬”的原因。
循环变量i
仍在增加,而Count
正在减少。
答案 2 :(得分:1)
因为您每次调用requestQueue.Dequeue()时都会更改requestQueue中的项目数量。而是将count的值存储在local中,并以该local作为上限循环。