如何检查文件/项目是否已存在于List <string>?</string>中

时间:2014-10-26 09:52:34

标签: c# .net winforms

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

5 个答案:

答案 0 :(得分:2)

从提供的输入中生成唯一文件名列表的最短方法可能是通过Union IEnumerable扩展

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

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

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

答案 1 :(得分: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);
    }

答案 2 :(得分:1)

首先,如果你有一个列表,并希望循环使用它,我总是建议使用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 ++;
        }

答案 3 :(得分:1)

你可以使用......

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

答案 4 :(得分:1)

在我看来,您尝试将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());