2012-07-13 102 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