我想从我经常更改的某些字符串中删除最后两行:
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));
答案 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 res1
和res2
将是:
你好,你好吗?
我很好,谢谢
答案 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);