我想基于定界符拆分大文本。

我用了:

string[] parts = text
  .Split(new string[] { Environment.NewLine + "##" }, StringSplitOptions.None);


我想知道开始位置(每个部分的字符索引)。我可以搜索循环中的每个部分:

int[] pos = new int[slides.Length];

for (int i = 0; i < slides.Length; i++)
{
    pos[i] = i == 0 ? text.IndexOf(slides[i]) : text.IndexOf(slides[i], pos[i-1] + 1);
}


或者,我可以搜索分隔符。我想知道是否有更快更好的解决方案。

最佳答案

您只有一个定界符,并且不会删除空项目。为什么不总结长度?

abc\r\n##defhhdsncdslcnslsc\r\n##pqr....
^        ^                       ^
0        abc.Length +            abc.Length +
         delimiter.Length        delimiter.Length +
                                 defhhdsncdslcnslsc.Length +
                                 delimiter.Length


代码(item及其index):

string delimiter = Environment.NewLine + "##";

int sum = 0;

var parts = text
  .Split(new string[] {delimiter}, StringSplitOptions.None)
  .Select(item => {
     int index = sum;
     sum = delimiter.Length + item.Length;

     return new {
       item,  // item
       index  // its index
     };
   });


或(2分隔的数组):

string[] parts = text.Split(new string[] {delimiter}, StringSplitOptions.None);
int[] pos = new pos[parts.Length];

for (int sum = 0, i = 0; i < parts.Length; sum += delimiter.Length + parts[i].Length, ++i)
  pos[i] = sum;

10-08 17:56