2012-01-21 37 views
0

我有按鈕的清單,我想是「平等」的兩個要素:尋找「對」的名單

for (int i = 0; i < Memory.Count; i++) 
{ 
    piezas = Memory.FindAll(s => (s.Name != Memory[i].Name && Utilidades.CompareImage(s.Image, Memory[i].Image))); 
} 

據說這是(如果我沒看錯)名單與兩個具有不同名稱但使用相同圖像的元素。我更確定這些元素存在......但我不知道爲什麼這不起作用。

「Utilidades.CompareImage」是一個靜態方法:

public static bool CompareImage(Image firstImage, Image secondImage) 
     { 
      MemoryStream ms = new MemoryStream(); 
      firstImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
      String firstBitmap = Convert.ToBase64String(ms.ToArray()); 
      ms.Position = 0; 

       secondImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
      String secondBitmap = Convert.ToBase64String(ms.ToArray()); 

      if (firstBitmap.Equals(secondBitmap)) 
       return true; 
      else 
       return false; 
     } 

我之前測試過的方法,它的工作是intented。

你能幫我嗎?

+0

你如何檢查你的代碼的結果?嘗試添加一些顯示中間結果的調試語句。代碼看起來像'它可能只是工作'... –

+0

使用斷點和var是從不2,它應該是除非我的謂詞是錯誤的。 – Areks

+0

那麼它應該是「兩個元素的列表」,而不是2. –

回答

1

代碼

for (int i = 0; i < Memory.Count; i++) 
{ 
    var piezas = Memory.FindAll(s => (s.Name != Memory[i].Name 
      && Utilidades.CompareImage(s.Image, Memory[i].Image))); 
} 

創建一個新的「piezas」每一次,然後不使用它。
你也檢查所有組合兩次。

所以,你想找到所有的對,第一對或者之間的東西?

速戰速決,但遠非完美,

for (int i = 0; i < Memory.Count; i++) 
{ 
    var piezas = Memory.FindAll(s => (s.Name != Memory[i].Name 
      && Utilidades.CompareImage(s.Image, Memory[i].Image))); 

    if (piezas.Count > 0) 
    { 
     // use piezas[0] somehow 
     break; 
    } 
} 
+0

是的,我真的很抱歉沒有說明這一點。我只想要第一對,(我之後使用'piezas',但我沒有複製它,因爲它不相關。 – Areks

+0

然後,不要用'var'聲明它,以免誤導。 –

+0

嗨,謝謝,但是我正在使用它,只是piezas.Count從來沒有兩個。我的FindAll查詢是否正確? – Areks

1

似乎沒有人提到的SelectMany尚未:

var pieza = Memory.SelectMany((m, i) => 
Memory.Where((m2, j) => i < j && m.Name != m2.Name && 
Utilidades.CompareImage(m.Image, m2.Image)) 
.Select(m2 => Tuple.Create(m, m2))).First(); 

如果你希望所有對,不只是一個,更換決賽第一( )調用ToList()或類似的東西。