2017-05-29 41 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」將解決問題。 –