【问题标题】:How to do cascade splitting with C# Linq - multiple foreach split如何使用 C# Linq 进行级联拆分 - 多个 foreach 拆分
【发布时间】:2017-10-29 17:04:20
【问题描述】:

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

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();
}

【问题讨论】:

  • 这太嵌套了,我什至看不出你在这里尝试什么
  • Split() 重载还不够吗?只需通过 lstsplitWord。 .Split(lstsplitWord)

标签: c# .net linq foreach split


【解决方案1】:

您可以按照给定的顺序迭代地将每个元素拆分为更小的部分:

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 &gt;= 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++;
}

【讨论】:

  • ty 获取详细答案:)
  • func_Split_By_String("أو") 呢?
  • @SergeyBerezovskiy 根据函数的名称,我确信(出于某种原因)它不包含任何特殊逻辑,并且 OP 只是实现了它,因为 String.Split() 没有 Split(string)超载。现在我明白我可能完全错了。无论如何,在代码 1 的情况下,添加“if (someCondition) use specialSplit else use string.split”可以解决问题。
  • 对于第二个答案,我需要编写另一个重载函数。因为我也应该能够按字符串拆分。我已将 func_Split_By_String 添加到问题中
  • @MonsterMMORPG 不,只需创建一些通用函数,将使用String.Split 或您的特殊函数并将此逻辑封装在其中。在任何地方都使用这个函数,而不是在整个应用程序中传播这个逻辑。恕我直言:)
猜你喜欢
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
相关资源
最近更新 更多