1

我试图在选中复选框时将图像添加到图像列表中,而当未选中复选框时,我想从列表中删除图像。添加图像可以正常工作,但是当未选中该框时,它不会从列表中删除图像。

List<Image> images = new List<Image>();
private void chkRadiation_CheckedChanged(object sender, EventArgs e)
    {

            if (chkRadiation.Checked == true && images.Count < 4)
        {
            images.Add(Image.FromFile(@"C:\Users\joe\documents\radiation.gif"));                
        }
            else if (chkRadiation.Checked == false)
            {                 
                images = images.Where(x => x !=  Image.FromFile(@"C:\Users\joe\documents\radiation.gif")).ToList();
            }
            else if
                (chkRadiation.Checked == true)
            {
                MessageBox.Show("Please select only 3 images");
                chkRadiation.Checked = false;
            }               
    }

我也试过

images.Remove(Image.FromFile(@"C:\Users\joe\documents\radiation.gif"));

它也没有工作。我究竟做错了什么?

4

3 回答 3

4

问题是您正在使用 class 的实例Image,因此您的所有比较images.Remove都在处理引用。

当你Image.FromFile(@"C:\Users\joe\documents\radiation.gif")创建一个新的图像对象/引用时,它恰好包含与列表中的数据相同的数据,但由于引用不一样,删除它是行不通的。

您可能会更好地使用Generic.Dictionary<String,Image>其中键字符串是图像的路径(在没有任何更好的键的情况下)重新编码。这样,您可以检查字典中是否有带有路径的项目并以相同的方式删除它们。

于 2012-07-13T16:14:11.030 回答
0

默认情况下 List.Remove 使用实例值比较来检测要删除的元素。由于您要再次加载图像以将其删除,因此这是一个不同的实例。我会跟踪添加图像的索引,并使用它从列表中删除它。CheckBox.Tag 可能是隐藏索引的好地方......

于 2012-07-13T16:14:07.750 回答
0

用表达式

x !=  Image.FromFile(@"C:\Users\joe\documents\radiation.gif")

你比较两个对象:

  • 对象一:x 是您收藏中已有的图像。
  • 对象二:是此时根据源路径创建的图像。

当您比较两者时,它总是返回 false,因为它们是对象 Image 的两个不同实例。

运算符 == 的工作原理

于 2012-07-13T16:15:14.350 回答