如何对字符串中的每两行进行计数

本文关键字:两行 字符串 | 更新日期: 2023-09-27 18:08:44

我有一个字符串变量叫做:Test
Test含量150行

我想计数每两行,并在这两行之后插入/添加一个新的空行,以使每两行之间有空间。

在索引3中插入空行,在索引6中插入空行,在索引9、12、15中插入空行。当我写到最后一行时,不要在它后面加上空行。只在每两行之间。不开头也不结尾,只在两行之间。

这就是我所拥有的:combindedString是单个字符串变量:

string[] ss = combindedString.Split(new string[] { "'n", "'r'n" },
                              StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < ss.Length; i++)
    ss[i] = ss[i].Trim();
combindedString = String.Join("'n", ss);

之后的代码,这也是我需要在combindedString结束它的内容是这样的:

我看到很多行第一行只是文本:hello world
第二行是日期时间线:6/16/2014
第三行是另一个文本:hello everyone
第四行还是日期& &;时间:5/16/2014

依此类推,所有行都是文本,后面是日期&时间。

我想在每个文本和日期时间行之后插入一个空白行。所以最后combindedString的内容看起来像:

Hello world
6/16/2014


大家好5/16/2014

这是测试
5/16/2014

而不是现在没有空格的样子。我想在每两行之间添加空格:

Hello world
6/16/2014
大家好
5/16/2014
这是测试
5/16/2014

在每个文本和日期时间行之后插入空/空格行。

如何对字符串中的每两行进行计数

你可以这样做:

string[] lines = combindedString.Split(new string[] { "'n", "'r'n" },
                     StringSplitOptions.RemoveEmptyEntries);
var result = new StringBuilder();
for (int i = 0; i < lines.Length; i++)
{
    if (i % 2 == 0 && i != 0)   // i != 0 to not get blank line at the beginning
        result.AppendLine();
    result.AppendLine(lines[i].Trim());
}
combindedString = result.ToString();

使用List<string>而不是数组要容易得多

string[] lines = new string[] {"1","2","3","4","5","6","7","8","9"};
List<string> copyList = lines.ToList();
for(int x = copyList.Count()- 1; x > 0; x--)
{
    if(x % 2 == 0)
        copyList.Insert(x, "");
}
string combinedString = string.Join(Environment.NewLine, copyList);

还有Linq

提供的一行解决方案
string result = string.Join(Environment.NewLine, 
       lines.Select ((l,i) => (i % 2 == 1 ? l + Environment.NewLine : l)));

这是一个函数,它将在每隔一行之后添加一行。

public string InsertLines(string Test)
{
    var builder = new StringBuilder();
    var lines = Test.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
    for (var i = 0; i < lines.Length; ++i)
    {
        if (i != 0 && i % 2 == 0)
            builder.AppendLine();
        builder.AppendLine(lines[i]);
    }
    return builder.ToString();
 }

这行得通:

var lookup = ss
    .Concat(ss.Length % 2 == 0
        ? Enumerable.Empty<string>()
        : new [] { "" })
    .Select((x, n) => new { x, n })
    .ToLookup(xn => xn.n % 2 == 0, xn => xn.x);
var query =
    lookup[true]
        .Zip(lookup[false], (o, e) => new [] { o, e, "" })
        .SelectMany(x => x);
var result = String.Join(Environment.NewLine, query);

LINQ一路。: -)