我有一个按钮列表,我想得到两个“相等”的元素:
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;
}
之前我已经测试了这个方法,并且它的工作是有意的。
你能帮帮我吗?
答案 0 :(得分: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;
}
}
答案 1 :(得分: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();
如果你想要所有的对,而不只是一个,则将最终的First()调用替换为ToList()或类似的东西。