C# 发现';成对';列表中

C# 发现';成对';列表中,c#,list,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))); } 我以前已经测试过这个方法,它的工作原理与预期相符 你能帮我一下吗?密码 for (int i = 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)));
}
我以前已经测试过这个方法,它的工作原理与预期相符

你能帮我一下吗?

密码

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)));
}
for(int i=0;i(s.Name!=Memory[i].Name
&&比较图像(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;
    }
}
for(int i=0;i(s.Name!=Memory[i].Name
&&比较图像(s.Image,Memory[i].Image));
如果(piezas.Count>0)
{
//以某种方式使用piezas[0]
打破
}
}

似乎还没有人提到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();
var-pieza=Memory.SelectMany((m,i)=>
Memory.Where((m2,j)=>iTuple.Create(m,m2)).First();

如果需要所有对,而不仅仅是一对,请替换对ToList()的最后第一个()调用或类似的调用。

如何检查代码的结果?尝试添加一些显示中间结果的调试语句。代码看起来像“它可能只是工作”…使用断点,变量永远不会是2,除非我的谓词是错误的。它应该是“两个元素的列表”,而不是2。是的,你是对的。我没有比较'var==2',而是比较'var.Count==2'。但我没有正确地说明问题。很抱歉。好的,编辑问题。“预期=2,实际=…”是的,我真的很抱歉没有说明这一点。我只想要第一双,(我在后面使用了'piezas',但我没有复制它,因为它不相关。然后也不要用
var
声明它。嗨,谢谢,但我一直在使用它。只是piezas.Count从来都不是两个。我的FindAll'query'对吗?
piezas.Count=1
意味着你发现了一个类似的元素,内存是
的[I]
。所以这是完全正确的。
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();