所以我这里有一个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,不是所有图像文件都有效。

10-04 11:38