如何检查列表中是否已存在文件?

时间:2012-12-25 16:27:53

标签: c#

这是代码:

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

两个列表LightningsRegions和Lightnings都是类型。 我想检查Lightnings中是否已存在LightningsRegions不再添加它。 但我在:pdf1.Lightnings.Add(lightningsRegions [i])上使用了一个breakpoing;它继续前进并添加我选择的相同索引。

在我的程序中,我有一个新的表格,我可以从一系列数字中选择,例如我在新表格上看到:闪电0长度32 [41 - 73]我点击这个,它将进入断点并将其添加到Lightnings List。

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

在这个新的表格菜单中,我有很多这样的字符串:闪电0长度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,我选择了这些项目。 因此,如果我通过点击它或在相同的项目上移动它而不是将它添加到闪电列表而不是同一个而不是任何其他项目,我想要这样做!只有当我移动或点击不在闪电列表中的项目时才添加它!

2 个答案:

答案 0 :(得分:1)

您可以使用Enumerable.Any

var result = pdf1.Lightnings.Any(c=>lightningsRegions.Contains(c));

答案 1 :(得分:0)

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

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


要验证我所说的内容确实是正确的,您可以检查调试时间,您会看到即使列表已包含您搜索代码的内容,仍会添加一个新实例,但对于您来说,它是重复的但是作为除非他们指向记忆中的同一区域,否则它们不相等。


所以,如果对你来说相关的是例如lightningRegion.Text(&#34;长度32 [41-73]&#34;)没有被添加两次,那么在If子句中检查:

if (!pdf1.Lightnings.Any(lightningRegion => lightningRegion.Text == lightningRegions[i].Text)
{
}