更新特定行的字符串,以便它不更新字符串中的重复项?

时间:2013-06-16 07:37:46

标签: c# string replace

我知道如何转到特定行,但我不知道如何更新字符串中的特定行。我尝试过替换功能,但它也会覆盖重复项。有什么想法吗?

  static string GetLine(string text, int lineNo)
  {
     string[] lines = text.Replace("\r", "").Split('\n');
     return lines.Length >= lineNo ? lines[lineNo - 1] : null;
  }

 static void Main(string[] args)
 {
   string file = "D:\\random.text";
   string contents = "";
   string text="random";
   contents = File.ReadAllText(file);
   finale=GetLine(contents,lines);
   // Console.ReadLine();
    if(finale.Contains(text))
    {
        finale.Replace(text,"Random");
        System.Console.WriteLine(finale);
        Console.ReadLine();
    }
 }

3 个答案:

答案 0 :(得分:1)

字符串是不可变类型,这意味着您无法更改现有字符串。 string.Replace返回被替换的字符串,您需要将其分配回来。

if(finale.Contains(text))
{
    finale = finale.Replace(text,"Random"); //<- note here
    System.Console.WriteLine(finale);
    Console.ReadLine();
}

从那里你需要重建字符串数组中的字符串,如Philippe所述。一个完整的例子(但未经测试):

  static string[] GetLines(string text)
  {
     return text.Replace("\r", "").Split('\n');
  }

  static string GetLine(string[] lines, int lineNo)
  {
      return lines.Length >= lineNo ? lines[lineNo - 1] : null;
  }

 static void Main(string[] args)
 {
   string file = "D:\\random.text";
   string contents = "";
   string text="random";
   contents = File.ReadAllText(file);
   var lines = GetLines(contents);
   finale = GetLine(lines, lineNo);
   //Console.ReadLine();
   if (finale == null)
       return;
    if(finale.Contains(text))
    {
        finale = finale.Replace(text, "Random");
        System.Console.WriteLine(finale);
        Console.ReadLine();
    }
    lines[lineNo] = finale;
    contents = string.Join('\n', lines);
 }

最重要的是,你根本不需要所有的分割功能。 .NET具有该功能,并且懒惰(按需),这是一个奖励。

如果您使用的是.NET 4.0及更高版本,请参阅File.ReadLines

答案 1 :(得分:0)

最快的解决方案是保持Split返回的数组,然后使用String.Join重建你开始的内容。

答案 2 :(得分:0)

在阅读文件时,只需使用字符串构建器重建字符串。

static void Main(string[] args)
{
    string file = "D:\\random.txt";
    string find = "random";
    string replace = "Random";

    StringBuilder resultList = new StringBuilder();
    using (var stream = File.OpenText(file))
    {
        while (stream.Peek() >= 0)
        {
            string line = stream.ReadLine();
            if(line == find)
            {
                line = replace;
            }

            resultList.AppendLine(line);
        }
    }
    string result = resultList.ToString();

    Console.WriteLine(result);

    Console.Read();
}