使用C#删除字符串中的最后2行?

时间:2019-04-03 19:17:49

标签: c# linq

我想从我经常更改的某些字符串中删除最后两行:

Hello How Are you ?
im fine Thanks
some info
some info

对于该示例,可以说我有上面的字符串 我想删除最后两行 “一些信息”

这就是我在下面尝试的 正如我所说的,最后两行总是带有朗读文本,这就是为什么我使用'Environment.NewLine'

string sem = mtstring = mtstring (mtstring .TrimEnd().LastIndexOf(Environment.NewLine));
            string Good = sem = sem.Remove(sem.TrimEnd().LastIndexOf(Environment.NewLine));

7 个答案:

答案 0 :(得分:2)

这里是一个班轮:

string good = string.Join(Environment.NewLine, mtstring.Split(Environment.NewLine).Reverse().Skip(2).Reverse());

编辑:

我进行了以下测试以测试时间效率,结果表明(如@TheodorZoulias所指出的那样),这种方法效率不高,因此对较大的数据集使用因果关系。

class Program
{
  static void Main(string[] args)
  {
    var testString = string.Join(Environment.NewLine, Enumerable.Range(0, 1000000));
    var oldArray = testString.Split();

    Stopwatch stopwatch = Stopwatch.StartNew();
    var newString = string.Join(Environment.NewLine, oldArray);
    stopwatch.Stop();
    Console.WriteLine($"String length: {newString.Length}");
    Console.WriteLine($"Time elapsed: {stopwatch.ElapsedMilliseconds} ms");

    stopwatch = Stopwatch.StartNew();
    newString = string.Join(Environment.NewLine, oldArray.Reverse().Skip(2).Reverse());
    stopwatch.Stop();
    Console.WriteLine($"String length: {newString.Length}");
    Console.WriteLine($"Time elapsed: {stopwatch.ElapsedMilliseconds} ms");
  }
}

输出:

  

字符串长度:9888886

     

经过的时间:45毫秒

     

字符串长度:9888876

     

经过的时间:188毫秒

总而言之,两次Reverse调用非常昂贵,与仅拆分和连接字符串相比,执行时间增加了四倍,这本身并不是一项廉价的任务。

答案 1 :(得分:1)

如果添加Microsoft的“ System.Interactive” NuGet程序包,则可以执行以下操作:

<canvas id="example-pie-chart-1" width="200" height="200"></canvas>
<script src="https://cdn.jsdelivr.net/npm/chart.js@2.8.0"></script>

答案 2 :(得分:0)

更改为:

string sem = mtstring.Remove(mtstring.LastIndexOf(Environment.NewLine));
string Good = sem.Remove(sem.LastIndexOf(Environment.NewLine));

答案 3 :(得分:0)

假设您使用Environment.NewLine作为分隔符,但可以更改为也使用任何分隔符

var str = "Hello How Are you ?" + Environment.NewLine +
          "im fine Thanks" + Environment.NewLine +
          "some info" + Environment.NewLine +
          "some info";

var split = str.Split(new [] { Environment.NewLine }, StringSplitOptions.None).ToList();

Console.WriteLine(string.Join(Environment.NewLine, split.Take(split.Count - 2)));
// Hello How Are you ?
// im fine Thanks

n.b。请注意,在Windows上,新行是\r\n。 Unix和Mac \n\r

答案 4 :(得分:0)

您可以尝试以下方法:

//Create list of strings for each line in mtstring
List<string> lines = mtstring.Split(
                        new string[] {"\n", "\r"}, 
                        StringSplitOptions.None
                ).ToList();

//Take a subset of these lines (Total - 2)
lines = lines.GetRange(0, lines.Count-2);

//Rejoin the list as a string
string Good = string.Join("\n", lines);

输出:

Hello How Are you ?

im fine Thanks

答案 5 :(得分:0)

快速(写而不执行)的解决方案是使用Linq:

var input = "Hello How Are you ?\r\nim fine Thanks\r\nsome info\r\nsome info";
var res1 = string.Join(Environment.NewLine, input
    .Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
    .Reverse()
    .Skip(2)
    .Reverse());

更理想的解决方案是使用StringBuilder

var sb = new StringBuilder();
var temp = input.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
for (var i = 0; i < temp.Length - 2; ++i)
    sb.AppendLine(temp[i]);

var res2 = sb.ToString();

Bot res1res2将是:

  

你好,你好吗?
  我很好,谢谢

答案 6 :(得分:-1)

实现效率。希望它不是越野车。

public static string RemoveLinesFromTheEnd(string source, int linesToRemove)
{
    var separators = new char[] { '\r', '\n' };
    int pos = source.Length;
    for (int i = 0; i < linesToRemove; i++)
    {
        pos = source.LastIndexOfAny(separators, pos - 1);
        if (pos > 0 && source[pos - 1] == '\r' && source[pos] == '\n') pos--;
        if (pos <= 0) break;
    }
    return pos < 0 ? "" : source.Substring(0, pos);
}

用法:

var cleanString = RemoveLinesFromTheEnd(mtstring, 2);