【问题标题】:Replacing Matching File Names in String List替换字符串列表中的匹配文件名
【发布时间】:2016-05-01 08:29:07
【问题描述】:

我有一个主文件列表Filelist。主列表包含完整文件路径,还有第二个列表copylist,它是通过从目录中获取内容来填充的。我需要替换@中的文件名987654323@ 与临时文件夹中的匹配,所以我使用了以下代码。

Filelist = new List<string>();   
//Code to Populate File List from openfiledialog   
try
{
    copylist = Directory.GetFiles(temppath + @"\mydir\");

    List<string> tempfiles = new List<string>(Filelist);
    int x = 0;
    foreach (string file in tempfiles)
    {
        for (int i = 0; i < copylist .Length; i++)
        {
            if (Path.GetFileName(file) == Path.GetFileName(copylist [i]))
            {
                MessageBox.Show("Removed: " + file + " \ninserted:" + copylist [i]);



                Filelist.RemoveAt(x);

                Filelist.Insert(x,copylist [i]);


            }
            x++;
        }

    }
}
catch (Exception)
{
}

我测试了 4 个文件...当我手动检查时匹配的文件名(即:临时文件夹和 FileList 中的相同文件名)。相等性检查 ie:Path.GetFileName(file) == Path.GetFileName(copylist [i]) 仅满足 2 个文件和最后,Filelist 中只有 1 个文件被替换,即使所有 4 个文件都存在于 temp 文件夹中。

我做错了什么。请指教。

【问题讨论】:

  • @MaciejLos 它是一个字符串列表。请参阅更新。

标签: c# .net string linq list


【解决方案1】:

您的程序的逻辑依赖于tempfilesFilelist 中的位置是相关的,并且x 对应于filetempfiles 中的位置。为了使其工作,您需要在if 内添加一个break,并将x++ 移动到外部循环:

foreach (string file in tempfiles) {
    for (int i = 0; i < copylist .Length; i++) {
        if (Path.GetFileName(file) == Path.GetFileName(copylist [i])) {
            MessageBox.Show($"Removed: {file}\ninserted:{copylist [i])}";
            Filelist.RemoveAt(x);
            Filelist.Insert(x,copylist[i]);
            break; // << Added
        }
    }
    x++; // << Moved
}

【讨论】:

    猜你喜欢
    • 2019-05-13
    • 2015-11-03
    • 2021-03-27
    • 2015-01-09
    • 2018-10-06
    • 1970-01-01
    • 2017-06-03
    • 2021-05-01
    • 2019-03-17
    相关资源
    最近更新 更多