Dictionary <int,string =“”>和Queue <keyvaluepair <int,string =“”>&gt;的输出之间的差异在C#中</keyvaluepair <int,> </int,>

时间:2013-02-12 14:13:25

标签: c# dictionary queue

任何人都可以帮助我理解为什么下面两个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();
        }
}

3 个答案:

答案 0 :(得分:6)

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

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 第3次迭代:requestQueue.Count为7,i2 第4次迭代:requestQueue.Count为6,i3 第5次迭代:requestQueue.Count为5,i4 第6次迭代:requestQueue.Count为4,i5。 - &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作为上限循环。