搜索FileName匹配的字符串列表并替换为新的FilePath

时间:2018-04-06 07:34:45

标签: c# .net list

我有List<string>名为Filelist,它包含文件的完整路径。我还有一个名为List<string>的{​​{1}},它还包含文件路径。我正在检查optimizelistFilelist是否包含相同的文件;如果是,则将optimizelist中的相应元素替换为Filelist中的元素。

optimizelist

但替换是不正确的,并且重复缺少条目。 我做错了什么?请指教。

3 个答案:

答案 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