C# 替换前面所有元素的列表

C# 替换前面所有元素的列表,c#,list,bitmap,C#,List,Bitmap,我第一次与C#合作,标题中出现了问题。这与stackoverflow中的其他问题类似,但是我使用了他们的答案建议的修复方法,仍然不起作用 我想保存视频的前50帧,我正在这样做(帧nr增量和循环不在此范围内,但它们与问题无关,因为该部分工作正常) if(帧号

我第一次与C#合作,标题中出现了问题。这与stackoverflow中的其他问题类似,但是我使用了他们的答案建议的修复方法,仍然不起作用

我想保存视频的前50帧,我正在这样做(帧nr增量和循环不在此范围内,但它们与问题无关,因为该部分工作正常)

if(帧号<50){
位图当前帧=新位图(宽度、高度、步幅、System.Drawing.Imaging.PixelFormat.Format24bppRgb,(IntPtr)当前帧);
_curr\u frame.Save(“C:\\curr\u frame\\frame\u nr++.png”);
prevFrames.Add(_curr_frame);}
此代码有效,因为前50个正确的帧保存在文件夹中

然而,在这之后,我立即开始这个循环

for (int y = 0; y < 50; y++)
{
    Bitmap _prev_frame = prevFrames[y];
    _prev_frame.Save("C:\\_prev_frame\\frame_nr_" + y + ".png");
}
for(int y=0;y<50;y++)
{
位图_prev_frame=prevFrames[y];
_保存(“C:\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;
}
所有的框架都被最后一个替换了


现在我知道在列表中添加会添加引用而不是复制,但是我检查的所有建议都表明,通过为每个元素在其中创建对象的新实例,它将引用每个不同的元素。所以我不知道我做错了什么,也许我遗漏了什么?

我想知道,当前帧是被更新还是被每个帧的图像数据覆盖?如果您刚刚更新它,则位图的所有实例都可能指向同一图像数据实例…保存时没有问题,因为图像数据始终是您要保存的帧,但当您稍后再次引用对象时,它们都将指向同一图像数据。

将位图添加到对象时,请尝试克隆位图列表:prevFrames.Add(_curr_frame.Clone())

但是通过每次创建一个新的对象实例,这不会避免问题吗?@user697110-您每次都创建一个新的位图对象,但我怀疑每个对象都指向相同的图像数据。在要传递(IntPtr)curr_帧的位图的构造函数中,如果该数据被更新,则指向该数据的每个位图也将被更新。你能在设置curr_frame的值时添加代码吗?我不能,因为老实说,我自己找不到,因为我正在编写一个给我的代码,我想问编写它的人。我可以说,我认为用这种方法确实正确地迭代了视频的几个帧。@user697110-我同意它会正确地迭代,所以当你保存时,你会得到你期望的结果,但是如果它们都指向同一个curr\u frame对象,那么它们引用的数据在保存后会被更新。如果看不到是什么决定了现状,我怀疑任何人都能提供更多帮助。也许值得在代码中查找一下,看看是否可以找到更新的位置。@DoctorMick-奇怪的是,如果我将该指针保存到另一个指针中,如下所示:\u prev\u frame=\u curr\u frame_当前帧=新位图(…);指针是_prev_frame仍然是旧的,并且没有更新,我假设在这种情况下也会发生同样的事情尝试过了,同样的问题也会发生
for (int y = 0; y < 50; y++)
{
    Bitmap _prev_frame = prevFrames[y];
    _prev_frame.Save("C:\\_prev_frame\\frame_nr_" + y + ".png");
}