所以我这里有一个foreach循环
foreach (string file in condensedFilesList)
{
Image imgToAdd;
imgToAdd = Image.FromFile(file);
if (imgToAdd.Width < 1920 || imgToAdd.Height < 1080)
{
//neither of the commented out lines worked when placed here
//imgToAdd = null;
//imgToAdd.Dispose();
condensedFilesList.Remove(file);
}
else
{
//neither of the commented out lines worked when placed here
//imgToAdd = null;
//imgToAdd.Dispose();
continue;
}
}
它包含指向.jpg图像的文件路径列表。其中大约有80个大小不一。我需要列表遍历每个图像,检查其分辨率是否为1920*1080,如果不是,则从数组中删除该文件路径指针。
现在它正在进行,在imgtoadd变量中设置要查看的图像,然后如果width属性或height属性与该项不匹配,则将删除该项。这对第一个条目有效。它的分辨率不符合要求,我的数组将从80个条目减少到79个条目。
但是我不能将imgtoadd变量清空,这样我就可以为它分配一个新的文件路径。我总是遇到一个情绪异常。我尝试运行.dispose(),将其设置为null,但我无法让它实际清空自身的资源。
dispose()使imgtoadd在检查元素时有一长串错误,而不是值。它的所有属性都在那里,但毫无价值,被错误所取代。如果我将它设置为null,它就会工作,在下一次迭代中,imgtoadd=null。buuuuut,当它试图为变量分配新的文件路径时,我仍在摆脱memoryException。
所以我不知道是怎么回事。我希望有人能指出我做错了什么,我看不出来。
编辑2:
我只是要覆盖这个编辑空间,如果人们想在我更新时检查函数的演变,请点击编辑历史。我尝试使用using(){}语句,如@dlatikay recommended,并将其写入一个新列表,但不幸的是,我仍在使用outofmemoryexception。这是功能
var tempList = new List<string>();
foreach (string file in condensedFilesList)
{
using (Image imgToAdd = Image.FromFile(file))
{
if (imgToAdd.Width < 1920 || imgToAdd.Height < 1080)
{
continue;
}
else
{
tempList.Add(file);
}
}
}
condensedFilesList = tempList;
最佳答案
使用using
。并将结果写入新列表,以便在枚举源列表时不会对其进行修改:
var finalList = new List<string>();
foreach (string file in condensedFilesList)
{
using(var imgToAdd = Image.FromFile(file))
{
if (imgToAdd.Width < 1920 || imgToAdd.Height < 1080)
{
/* omit */
}
else
{
finalList.Add(file);
}
}
}
不需要分配空值,也不需要显式调用dispose()。
我建议添加try..catch,不是所有图像文件都有效。