我有List<string>
名为Filelist
,它包含文件的完整路径。我还有一个名为List<string>
的{{1}},它还包含文件路径。我正在检查optimizelist
中Filelist
是否包含相同的文件;如果是,则将optimizelist
中的相应元素替换为Filelist
中的元素。
optimizelist
但替换是不正确的,并且重复和缺少条目。 我做错了什么?请指教。
答案 0 :(得分:3)
您正在更改正在迭代的列表,这可能会导致意外行为。您可以通过向后迭代来避免意外(因为更改是在当前索引和列表末尾完成的,所以永远不要在较低的索引处完成)。
for (int i = Filelist.Count - 1; i >= 0; i--)
编辑:您可能还想删除“break”语句。它可以防止您的代码迭代完整列表。
答案 1 :(得分:1)
在枚举列表时,您正在删除(在中间)并添加(到最后)。这不是一个好主意,并导致这个问题。我建议用这种方法替换文件:
var fileNameLookup = optimizelist.ToLookup(f => Path.GetFileName(f));
for (int i = 0; i < Filelist.Count; i++)
{
string fileName = Path.GetFileName(Filelist[i]);
var optimizedFile = fileNameLookup[fileName].FirstOrDefault();
if(optimizedFile != null)
Filelist[i] = optimizedFile;
}
答案 2 :(得分:1)
除了Peter M.回答:如果optimizelist
中没有重复项,您可以尝试使用词典:
// key - what to find (file name without directory, e.g. "abc.txt")
// value - what to substitute (full path name, e.g. "c:\test\abc.txt")
// StringComparer.OrdinalIgnoreCase - case insensitive keys, i.e. "abc.txt" == "ABC.txt"
Dictionary<string, string> substitutes = optimizelist
.ToDictionary(item => Path.GetFileName(item),
item => item,
StringComparer.OrdinalIgnoreCase);
for (int i = 0; i < Filelist.Count; i++)
// if we have a substitution (i.e. a better file path)...
if (optimizelist.TryGetValue(Path.GetFileName(Filelist[i]), out var optimalFile))
Filelist[i] = optimalFile; // <- substitute with optimalFile