Dictionary<;int,字符串>;并且队列<;KeyValuePair<;int,字符串>&

本文关键字:lt gt 字符串 int KeyValuePair 队列 Dictionary | 更新日期: 2023-09-27 17:58:45

有人能帮我理解为什么下面两个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();
        }
}

Dictionary<;int,字符串>;并且队列<;KeyValuePair<;int,字符串>&

您需要在循环之前保存计数:

var count = requestQueue.Count;
for (int i = 0; i < count; i++)
{
    Console.WriteLine(requestQueue.Peek().Value);
    requestQueue.Dequeue();
}

原因是在for循环的每次迭代中都会对其进行评估:

在第一次迭代开始时,requestQueue.Count是9,i0
第二次迭代:requestQueue.Count是8,i1
第三次迭代:requestQueue.Count为7,i2
第4次迭代:requestQueue.Count为6,i3
第5次迭代:requestQueue.Count为5,i4
第6次迭代:requestQueue.Count为4,i5。-->退出循环。

注意:队列的Count会随着每次迭代而减少,因为Queue.Dequeue会删除队列中的第一个项目并将其返回给调用者。

您可能想使用这个while-loop,它在这里更有意义:

while (requestQueue.Count > 0)
{
    Console.WriteLine(requestQueue.Peek().Value);
    requestQueue.Dequeue();
}

for-loop的问题是Queue.Dequeue删除了第一个项目,这也减少了Count的属性。这就是为什么它停止"中途"。

循环变量CCD_ 30仍在增加,而CCD_。

因为每次调用requestQueue时都会更改requestQueue中的项目数量。取消排队()。相反,将count的值存储在一个局部循环中,并将该局部作为上限。