Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中拆分文本并保留每个部分的位置_C#_String_Split - Fatal编程技术网

如何在C#中拆分文本并保留每个部分的位置

如何在C#中拆分文本并保留每个部分的位置,c#,string,split,C#,String,Split,我想根据分隔符拆分一个大文本 我用过: 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]

我想根据分隔符拆分一个大文本

我用过:

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);
}
int[]pos=newint[slides.Length];
对于(int i=0;i
或者我可以搜索分隔符。我想知道是否有更快更好的解决方案。

您只有一个分隔符,并且不删除空项;为什么不总结一下长度呢

abc\r\n##defhhdsncdslcnslsc\r\n##pqr....
^        ^                       ^
0        abc.Length +            abc.Length + 
         delimiter.Length        delimiter.Length +  
                                 defhhdsncdslcnslsc.Length +
                                 delimiter.Length  
代码(项目及其索引):

或(
2
分离数组):

string[]parts=text.Split(新字符串[]{delimiter},StringSplitOptions.None);
int[]位置=新位置[零件长度];
对于(int sum=0,i=0;i
您只有一个分隔符,不删除空项;为什么不总结一下长度呢

abc\r\n##defhhdsncdslcnslsc\r\n##pqr....
^        ^                       ^
0        abc.Length +            abc.Length + 
         delimiter.Length        delimiter.Length +  
                                 defhhdsncdslcnslsc.Length +
                                 delimiter.Length  
代码(项目及其索引):

或(
2
分离数组):

string[]parts=text.Split(新字符串[]{delimiter},StringSplitOptions.None);
int[]位置=新位置[零件长度];
对于(int sum=0,i=0;i
您如何定义“更好更快”?通常,这是测试/调试最快的方法,也是下一个人最容易理解的方法。除非您知道您将处理数百万项,否则通常最好忽略纯性能,直到它成为一个问题。获取每个部分的起始位置的简单解决方案是使用
IndexOf
搜索分隔符。这对于大字符串来说不是很有效。虽然仍然不是最理想的解决方案,但您可以使用它。假设
start[i]
零件[i]
的开始位置。然后我们可以说
start[i+1]=start[i]+parts[i].Length
。因此,从
i=0
开始,起始索引为
0
,然后从那里开始工作。添加:我忘记了分隔符是原始的,而不是
parts
,因此它变成了
start[i+1]=[start[i]+parts[i]。长度+{Length of delimiter}
。如何定义“更好更快”?通常,这是测试/调试最快的方法,也是下一个家伙最容易理解的方法。除非你知道你将处理数百万项,否则通常最好忽略纯性能,直到它成为问题。获得每个部分的开始位置的简单解决方案是使用
IndexOf
来搜索分隔符。这对于大字符串来说不是很有效。虽然仍然不是最理想的解决方案,但您可以使用它。假设
start[i]
parts[i]
的开始位置。然后我们可以说
start[i+1]=start[i]+parts[i].Length
。因此,从
i=0
开始,起始索引为
0
,然后从那里开始工作。添加:我忘记了分隔符是原始的,而不是
部分
,因此它变成
start[i+1]=[start[i]+部分[i]。Length+{Length of delimiter}
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;