变量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;
}
答案 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());