C# 如何检查列表中是否已存在文件/项?

C# 如何检查列表中是否已存在文件/项?,c#,.net,winforms,C#,.net,Winforms,变量fi FileInfo[]包含例如10个文件。 我想循环检查这些文件,并检查它们中的每一个是否已经存在于列表AnimateEdge文件中。如果列表中不存在fi中的第一个文件,请继续循环检查fi中的第二个文件、第三个文件和所有文件,然后继续 if (ToCreate == false) { combined = Path.Combine(sf, fi[simtest].FullName); if (AnimatedGifFiles.Count == 0) {

变量fi FileInfo[]包含例如10个文件。 我想循环检查这些文件,并检查它们中的每一个是否已经存在于列表AnimateEdge文件中。如果列表中不存在fi中的第一个文件,请继续循环检查fi中的第二个文件、第三个文件和所有文件,然后继续

if (ToCreate == false)
{
    combined = Path.Combine(sf, fi[simtest].FullName);

    if (AnimatedGifFiles.Count == 0)
    {
        AnimatedGifFiles.Add(combined);
    }
    for (int i = 0; i < AnimatedGifFiles.Count; i++)
    {
        if (!AnimatedGifFiles[i].Contains(combined))
        {
            AnimatedGifFiles.Add(combined);//last_file);
        }
    }
    simtest += 1;
}
我现在的做法是,如果第一个或第二个文件不存在,程序将继续

if (ToCreate == false)
{
    combined = Path.Combine(sf, fi[simtest].FullName);

    if (AnimatedGifFiles.Count == 0)
    {
        AnimatedGifFiles.Add(combined);
    }
    for (int i = 0; i < AnimatedGifFiles.Count; i++)
    {
        if (!AnimatedGifFiles[i].Contains(combined))
        {
            AnimatedGifFiles.Add(combined);//last_file);
        }
    }
    simtest += 1;
}

最好使用HashSet来了解某个元素的存在性:

    var AnimatedGifFiles = new HashSet<string>(
        new string[] {
            "file1",
            "file2"
    });

    foreach (var fileItem in fi)
    {
        combined = Path.Combine(sf, fileItem.FullName);
        var added = AnimatedGifFiles.Add(combined);
    }

首先,如果您有一个列表,并且希望循环遍历它,我总是建议在愚人行中使用foreach字符串foo

但是,如果要检查组合后的字符串是否已存在于列表中,只需使用if list.contains进行检查,这样在您的情况下就不需要循环

这应该适合您:

        if (ToCreate == false)
        {
            combined = Path.Combine(sf, fi[simtest].FullName);

            if (AnimatedGifFiles.Contains(combined) == false)
                AnimatedGifFiles.Add(combined);

            simtest ++;
        }
你可以用

   if (!AnimatedGifFiles.Contains(combined))
      AnimatedGifFiles.Add(combined);
而不是

 for (int i = 0; i < AnimatedGifFiles.Count; i++)
    {
        if (!AnimatedGifFiles[i].Contains(combined))
        {
            AnimatedGifFiles.Add(combined);//last_file);
        }
    }

在我看来,您试图将fi中当前不存在的所有文件名都添加到该列表中。是这样吗

如果是的话,这是可行的:

AnimatedGifFiles
    .AddRange(
        fi
            .Select(x => x.FullName)
            .Where(x => !AnimatedGifFiles.Contains(x))
            .Distinct()
            .ToArray());
这实际上更美好:

AnimatedGifFiles
    .AddRange(
        fi
            .Select(x => x.FullName)
            .Except(AnimatedGifFiles)
            .Distinct()
            .ToArray());

从给定的输入生成唯一文件名列表的最短方法可能是通过扩展来实现

AnimatedGifsFiles = AnimatedGifsFiles.Union(fi.Select(x => x.FullName)).ToList();
并集使用默认值生成两个序列的集合并集 相等比较器


我还要指出上面代码中可能存在的问题。使用Path.Combine从变量sf加上FileInfo.FullName创建新路径是完全错误的。FullName属性已经包含路径名。

为什么不能按列表bool该值。存在您知道在循环遍历AnimatedGifFiles时不能修改它吗?在我看来,您试图将当前不存在的所有文件名都添加到该列表中。是吗?你必须写x全名而不是x。Name@gabba您是对的,一个简化的复制/粘贴错误test@gabba现在你让我看看。操作代码中有些地方不太正确。路径。与全名合并似乎是错误的。非常感谢。来自的复制/粘贴错误question@gabba-我添加了.Distinct以消除重复的可能性。