请问C#中队列的操作方法Queue.ElementAt(int index);会修改元素值吗,

请问C#中队列的操作方法Queue.ElementAt(int index);会修改元素值吗,

问题描述:

程序提示我集合在枚举数实例化后进行了修改,我百度说是在遍历的过程中修改了元素值,抛异常的代码如下:

for (int i = 0; i < dataQueue.Count; i++)
{
chart1.Series[0].Points.AddY(dataQueue.ElementAt(i));
}
请问一下是因为哪个地方修改了元素值导致抛这个异常啊
完整代码如下:
public void AddData(int[] Data1, int[] Data2)//Data1包含从串口传入的数据
{
for (int i = 0; i < Data1.Length; i++)
{
dataQueue.Enqueue(Data1[i]);

}
}
另一段是:
public void Draw()
{
chart1.Series[0].Points.Clear();
if (dataQueue.Count > 500)
dataQueue.Dequeue();//Dequeue()返回队列第一个数据并移除,原先队列的第二个数据变为第一个
for (int i = 0; i < dataQueue.Count; i++)
{
chart1.Series[0].Points.AddY(dataQueue.ElementAt(i));
}
}
这两个操作队列的操作分别在不同的子函数里

按照你这个流程写了一下。

            int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            Queue<int> queNums = new Queue<int>(nums);
            List<int> lstNums = new List<int>();

            for (int i = 0; i < queNums.Count; i++)
            {
                lstNums.Add(queNums.ElementAt(i));
            }

            Console.WriteLine(string.Join("\t", lstNums));

因为你用了ElementAt()这个方法我认为你这个用的应该是支持泛型的Queue<T>。可是这段代码我的编译器里并没有出错。
你还有做别的操作吗?
以及ElelmentAt()这个方法是IEnumerable<T>的扩展方法,只是返回特定位置的元素,应该是不会改变元素的。

楼主问题可有解决,我遇到了同样的问题

我今天也遇到了这个问题,我的代码本来是这样的
img
然后运行时就提示集合在枚举数实例化后进行了操作,按照字面理解那就是我进行了出列操作,队列的元素数变少了,但我操作的还是之前那个队列,所以报错了,可以理解为跟数组超出索引值差不多的意思,那如果我们每出列一次就刷新一次队列,再进入循环就应该没问题了,所以我在每次出列后跳出循环,再重新进入遍历就不报错了,你可以按照这种思路试一下,你这个不知道是add还是出列导致队列的大小变了但是你之后使用的不是最新的队列所以报错,具体你自己试一下,不过我觉得这个思路应该是没问题的