如何检查文件/项目是否已存在于列表<字符串>中

本文关键字:于列表 列表 字符串 存在 是否 检查 何检查 文件 项目 | 更新日期: 2023-09-27 18:27:55

变量fi(FileInfo[](包含例如10个文件。我想遍历这些文件并检查每个文件中是否已经存在于List<string> AnimatedGifFiles中,如果列表中的第一个文件不存在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;
}

如何检查文件/项目是否已存在于列表<字符串>中

从给定的输入中生成唯一文件名列表的最短方法可能是通过联合 IEnumerable 扩展名来完成

AnimatedGifsFiles = AnimatedGifsFiles.Union(fi.Select(x => x.FullName)).ToList();

UNION 使用默认值生成两个序列的集合并集 相等比较器

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

首先,如果你有一个列表,并且想遍历它,我总是建议使用 foreach (string foo in foolist) .

但是,如果您想检查组合的字符串是否已存在于列表中,您只需用if (list.Contains(combined))检查它,因此在您的情况下循环遍历它应该是不必要的。

这应该适合您:

        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添加到该列表中。是吗?

如果是这样,这有效:

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());

Beter 使用 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);
    }