2012-07-13 70 views
1

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

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

它也不能工作。 我在做什么错?

+0

看看列表一个.remove()方法,并了解它接收到什么类型的参数。 ;) – 2012-07-13 16:11:11

+0

它说它删除了一个图像项目。我试过了,它没有做我所需要的。当项目被删除时,我需要list.count()被减少。 – talbright 2012-07-13 16:14:23

回答

4

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

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

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

+0

很好的答案。谢谢。 – talbright 2012-07-13 16:18:19

0

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

0

与表达

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

你比较两个对象:

  • 对象之一:x是图像已经在你的收藏。
  • 对象二:就是 基于源路径创建此时的图像。

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

How the operator == works