2017-05-29 44 views
4

这些价值观,我想拆分字符串cascadingly怎么办级联分裂与C#的LINQ - 多重的foreach分裂

List<string> lstsplitWord = new List<string> { ",", "=", "،", "أو", "او", "/", "." }; 

我已经写了他们作为这样的,但我假设必须有更优雅此

foreach(var part1 in srSplitPart.Split(',')) { 
    foreach(var part2 in part1.Split('=')) { 
     foreach(var part3 in part2.Split('،')) { 
     foreach(var part4 in part3.func_Split_By_String("أو")) { 
     foreach(var part5 in part4.func_Split_By_String("او")) { 
     foreach(var part6 in part5.Split('/')) { 
      foreach(var part7 in part6.Split('.')) { 
      if (part7.Length < 3) 
      continue; 
      string srTrans = part7.FixArabic().func_Special_Trim(); 

      srTemp.AppendLine($ "{srTitle} > {srTrans} \t {irTransLevel}"); 
      irTransLevel++; 
      } 
     } 
     } 
     } 
     } 
    } 
    } 

C#的.NET 4.6.2

特殊分裂功能LINQ溶液

public static List<string> func_Split_By_String(this string Sentence, string srReplace) 
{ 
    return Sentence.Split(new string[] { srReplace }, StringSplitOptions.None).ToList(); 
} 
+1

之所以如此嵌套我甚至不能告诉你想在这里什么 – EpicKip

+1

不是斯普利特()超载就够了吗?只是通过lstsplitWord。 .Split(lstsplitWord) – Fabiano

回答

3

你可以只迭代每一个元素在给定的顺序分成更小的部分:

string originalString = ...; 
List<string> separators = new List<string> { ",", "=", "،", "أو", "او", "/", "." }; 

string[] result = new[] { originalString }; 

foreach (var separator in separators) 
{ 
    result = result.SelectMany(x => x.Split(new[] { separator }, StringSplitOptions.RemoveEmptyEntries)).ToArray(); 
} 

result = result 
    .Where(x => x.Length >= 3) 
    .Select(x => x.FixArabic().func_Special_Trim()) 
    .ToArray(); 

foreach (var item in result) 
{ 
    srTemp.AppendLine($ "{srTitle} > {srTrans} \t {irTransLevel}"); 
    irTransLevel++; 
} 

在开始的时候,您的阵列只包含你的原始字符串。
在第一个foreach之后,迭代数组将包含以“,”分隔的原始字符串。
迭代后的第二个foreach每个逗号分隔的部分将被=分开。
它会重复,直到result数组只包含由所有给定分隔符分隔的字符串。然后它应用Length >= 3条件和FixArabic()func_Special_Trim()

更新:我刚刚明白一两件事 - 将在一个给定的顺序结果所有的隔板插入相同字符串数组作为简单地将所有的隔板无秩序。

所以,实际上,你可以这样做:

string originalString = ...; 
string[] separators = new[] { ",", "=", "،", "أو", "او", "/", "." }; 

string[] result = originalString 
    .Split(separators, StringSplitOptions.RemoveEmptyEntries) 
    .Where(x => x.Length >= 3) 
    .Select(x => x.FixArabic().func_Special_Trim()) 
    .ToArray(); 

foreach (var item in result) 
{ 
    srTemp.AppendLine($ "{srTitle} > {srTrans} \t {irTransLevel}"); 
    irTransLevel++; 
} 
+0

ty for detailed answer :) – MonsterMMORPG

+1

'func_Split_By_String(“أو”)'? –

+0

@SergeyBerezovskiy根据函数的名称,我确定(出于某种原因)它不包含任何特殊的逻辑,并且OP只是实现它,因为'String.Split()'没有'Split(string)'超载。现在我明白我可能是绝对错误的。无论如何,在代码1的情况下,添加“if(someCondition)使用specialSplit else use string.split”将解决问题。 –