C#中输出Dictionary <int,string>和Queue <KeyValuePair <int,string >>之间的差异

Gga*_*Gga 1 c# queue dictionary

任何人都可以帮助我理解为什么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();
        }
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*rth 6

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

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

原因是它在for循环的每次迭代中被计算:

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

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