如何检查文件/项目是否已存在于列表<字符串>中
本文关键字:于列表 列表 字符串 存在 是否 检查 何检查 文件 项目 | 更新日期: 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);
}