1

我在我的代码中找不到任何错误。
在这里,我试图从字符串中选择所有数字:(
只是为了简化示例,我想选择满足某些条件的数字)
我使用队列,因为我不想处理数组的索引。

        Console.Write("enter string: ");
        string s = Console.ReadLine();
        char[] array = s.ToCharArray();
        Queue<char> q = new Queue<char>();

        for (int i = 0; i < array.Length; i++)
        {
            q.Enqueue(array[i]);
        }

        char[] new_array = new char[q.Count];
        for (int i = 0; i < q.Count; i++)
        {
            new_array[i] = q.Dequeue();
        }

        Console.WriteLine(new String(new_array));    

输入字符串:123456
输出有点奇怪:
123

另一个输入:123
输出:12

当然我犯了一些错误)但一切似乎都很好
提前谢谢你

4

5 回答 5

4

问题是第二个循环:

    for (int i = 0; i < q.Count; i++)
    {
        new_array[i] = q.Dequeue();
    }

随着q.Count每次循环迭代的递减和每次迭代的i增加,您只能获得一半的元素。

尝试类似:

    for (int i = 0; q.Count > 0; i++)
    {
        new_array[i] = q.Dequeue();
    }

还要考虑:Queue.toArray

于 2012-11-01T14:17:47.443 回答
1

由于您的错误原因已经说明,您可以用两个语句替换两个循环

//A version of Queue constructor accepts IEnumerable object.
//you can directly pass the string to the queue constructor.
Queue<char> Que = new Queue<char>("123456");

//Copies the array and the position is preserved
var new_arr= Que.ToArray();
于 2012-11-01T14:35:56.600 回答
1

我建议使用List<char>而不是Queue<char>and char[]。这里没有什么特别需要队列,它可以避免 Rudolf 指出的问题,并且 aList比数组更容易使用。您也可以使用foreach而不是for循环,并避免中间步骤。

    Console.Write("enter string: ");
    string s = Console.ReadLine();
    List<char> new_array = new List<char>();
    foreach(char c in s.ToCharArray())
    {
        new_array.Add(c);
    }

    Console.WriteLine(new String(new_array.ToArray()));  
于 2012-11-01T14:32:20.770 回答
0

当您使用 Dequeue() 时,q.Count 值在每次迭代中都会发生变化。所以不要在这个循环中使用 q.Count ;

 for (int i = 0; i < q.Count; i++)

利用

 int queueSize = q.Count;
 for (int i = 0; i < queueSize; i++)   

这将使您的循环限制保持为常数,而不是在每次迭代中计算它以找到不同的值,因为使用了 Dequeue()。

于 2012-11-01T15:12:47.697 回答
0

According to MSDN:

Removes and returns the object at the beginning of the Queue.

于 2012-11-01T14:18:29.877 回答