4

我一直在编写一个存储学生姓名和年龄的程序(名字、姓氏、年龄在 .txt 文件中)。我现在正在制作“删除学生”部分,当我希望用户选择要删除的名称(通过切断文件名的 .txt 扩展名来打印)时,它不会替换“.txt”部分一无所有。
代码是:

    string inputSel; // Selection string for delete
    Console.WriteLine(" -- Deleting Grade {0} -- ", grade);
    Console.WriteLine("- Enter a student name to delete: ");
    foreach (string file in fileNames)
    {
        file.Replace(".txt", "");
        studentNames.Add(file);
        Console.WriteLine(file); // debug
    }
    foreach (string name in studentNames)
    {
        Console.Write("{0}\t", name);
    }
    Console.WriteLine();
    Console.Write("> ");
    inputSel = Console.ReadLine();

其中 fileNames 是 a List<string>,它是此代码所在方法的参数。 studentNames 也是 a List<string>,它存储名称(不带 .txt 的文件名),但出于某种原因,它仍然使用 .txt 打印名称。
长话短说,它不会替换".txt""".

4

4 回答 4

8

这是因为 String.Replace 返回值,而不是修改见这里

file = file.Replace(".txt", "");

我建议使用

file = Path.GetFileNameWithoutExtension(file);

Path.GetFileNameWithoutExtension将适用于所有扩展,它看起来更干净,并说明在那里做了什么:)

于 2013-10-30T07:21:36.733 回答
3

String.Replace方法创建新字符串。它不会修改您传递的字符串。您应该将替换结果分配给您的字符串:

file = file.Replace(".txt", "");

另外我建议你用来Path.GetFileNameWithoutExtension获取不带扩展名的文件名

file = Path.GetFileNameWithoutExtension(file);
于 2013-10-30T07:23:05.113 回答
3

您在替换“.txt”后省略了设置文件值试试这个:

...
foreach (string file in fileNames)
{
    file = file.Replace(".txt", "");
    studentNames.Add(file);
    Console.WriteLine(file); // debug
}
...
于 2013-10-30T07:23:22.563 回答
1
string.Replace();

不修改返回副本的字符串。另一个问题是foreach 迭代器是只读的,所以你需要这样的东西。

fileNames = fileNames.Select
            (Path.GetFileNameWithoutExtension);

希望这可以帮助!

于 2013-10-30T07:42:09.003 回答