从列表中删除图像c#

时间:2012-07-13 16:08:20

标签: c# image list checkbox

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

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"));

它也没用。 我做错了什么?

3 个答案:

答案 0 :(得分:4)

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

当您Image.FromFile(@"C:\Users\joe\documents\radiation.gif")创建新的图像对象/引用时,恰好包含与列表中的数据相同的数据,但由于引用不相同,因此删除它不会工作

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

表达式

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

你比较两个对象:

  • 对象一:x是集合中已有的图像。
  • 对象二:是 此时基于源路径创建的图像。

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

How the operator == works