如何使用C# Linq进行级联拆分 - 多个foreach拆分

4

这些是我想要级联拆分字符串的值

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

我已经这样写了,但我认为可能有更优雅的Linq解决方案

    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

特殊分割函数

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
Split()重载不够吗?只需传递lstsplitWord.Split(lstsplitWord)即可。 - Fabiano
1个回答

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++;
}

感谢您详细的回答 :) - Furkan Gözükara
1
func_Split_By_String("أو") 怎么样? - Sergey Berezovskiy
根据函数名称,我确信(出于某种原因)它不包含任何特殊逻辑,OP只是实现它是因为String.Split()没有Split(string)重载。现在我明白我可能完全错了。无论如何,在代码1的情况下,添加“if (someCondition) use specialSplit else use string.split”将解决问题。 - Yeldar Kurmangaliyev
对于第二个答案,我需要编写另一个重载函数。因为我也应该能够按字符串拆分。我已经在问题中添加了func_Split_By_String。 - Furkan Gözükara
@MonsterMMORPG 不用,只需编写一个通用函数,该函数将使用String.Split或您的特殊函数,并在其中封装此逻辑。在整个应用程序中使用此函数,而不是将此逻辑分散到整个应用程序中。 在我看来 :) - Yeldar Kurmangaliyev
如果你只需要循环结果,可以将其保留为可枚举对象,并避免创建新数组。 - Antonín Lejsek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接