0

这是代码:

for (int i = 0; i < lightningsRegions.Count; i++)
{
    if (!pdf1.Lightnings.Contains(lightningsRegions[i]))
    {
        pdf1.Lightnings.Add(lightningsRegions[i]);
        break;
    }
}

Lists LightningsRegions 和 Lightnings 都是类型。我想检查Lightnings中是否已经存在LightningsRegions,不要再次添加。但是我在以下位置使用了断点:pdf1.Lightnings.Add(lightningsRegions[i]); 它一直在那里并添加我选择的相同索引。

在我的程序中,我有一个新表格,我可以从一系列数字中进行选择,例如我在新表格上看到:Lightning 0 Length 32 [41 - 73] 我点击它,它会进入断点并添加它一次到闪电名单。

所以现在在索引 [0] 的闪电列表中我有:“闪电 0 长度 32 [41 - 73]”现在如果在同一个菜单中我再次点击这个闪电 0 长度 32 [41 - 73] 它不应该去和将其添加到闪电列表中,但确实如此。

在这个新的表单菜单中,我有很多这样的字符串:Lightning 0 Length 32 [41 - 73] 但我想确保如果我点击它两次它只会添加一次,如果我点击另一个不是同样它会添加它。

但是由于某种原因,现在当我单击它两次时,它会到达相同的断点并再次添加它。

更新:

private void listBox1_SelectedIndexChanged(object sender, System.EventArgs e)
        {
            if (listBox1.SelectedItem != null)
            {
                item = listBox1.SelectedItem.ToString();
                this.f1.PlayLightnings();
                f1.pdftoolsmenu();
            }
        }

这是我选择项目的新表单中的 listBox1。所以我想做到这一点,如果我通过单击它或在同一个项目上移动它来选择它,它不会将它添加到闪电列表中,而不是同一个项目,而不是任何其他项目!只有当我移动或单击不在闪电列表中的项目时,才添加它!

4

2 回答 2

1

您可以使用Enumerable.Any

var result = pdf1.Lightnings.Any(c=>lightningsRegions.Contains(c));
于 2012-12-25T16:30:45.663 回答
0

使用 Contains 时,Equality 用于确定列表是否确实包含您正在检查的实例,但如果您比较的是引用类型而不是值类型,则 Equality 的行为不同。

因此,不要使用 Contains,而是尝试使用 Linq 扩展方法 Any(),并在作为参数给出的委托方法中放置与您相关的字段。


要验证我所说的确实正确,您可以在调试时检查,您会看到即使列表已经包含您正在搜索的代码,您的代码仍将添加一个新实例,该实例对您来说是重复的,但随着实例的进行,它们除非它们指向内存中的同一区域,否则它们不相等。


因此,如果对您而言,不添加两次 LightningRegion.Text 例如 ("Length 32 [41 - 73]") 是相关的,那么在 If 子句中检查:

if (!pdf1.Lightnings.Any(lightningRegion => lightningRegion.Text == lightningRegions[i].Text)
{
}
于 2012-12-25T16:32:36.377 回答