在列表中查找“对”

时间:2012-01-21 22:01:32

标签: c# list

我有一个按钮列表,我想得到两个“相等”的元素:

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;
        }

之前我已经测试了这个方法,并且它的工作是有意的。

你能帮帮我吗?

2 个答案:

答案 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()或类似的东西。