c# - 使用 C#,LINQ 如何一次又一次地在标记之间选择项目?

标签 c# linq

假设我有一个字符串数组:

string[] strArray = {"aa", "bb", "xx", "cc", "xx", "dd", "ee", "ff", "xx","xx","gg","xx"};

如何使用 LINQ 将“xx”标记之间的字符串提取为组?

比如将它们写入控制台:

cc
dd,ee,ff
gg

最佳答案

纯功能解决方案(无突变):

string[] strArray = { "aa", "bb", "xx", "cc", "xx", "dd", 
                      "ee", "ff", "xx", "xx", "gg", "xx" };

var result = 
 strArray.Aggregate((IEnumerable<IEnumerable<string>>)new IEnumerable<string>[0],
   (a, s) => s == "xx" ? a.Concat(new[] { new string[0] })
      : a.Any() ? a.Except(new[] { a.Last() })
                   .Concat(new[] { a.Last().Concat(new[] { s }) }) : a)
         .Where(l => l.Any());

// Test
foreach (var i in result)
  Console.WriteLine(String.Join(",", i.ToArray()));

如果要过滤掉最后一个标记之后的结果:

string[] strArray = { "aa", "bb", "xx", "cc", "xx", "dd", 
                      "ee", "ff", "xx", "xx", "gg", "xx"};

var result = 
  strArray.Aggregate(
    new { C = (IEnumerable<string>)null, 
          L = (IEnumerable<IEnumerable<string>>)new IEnumerable<string>[0] },
    (a, s) => s == "xx" ? a.C == null
        ? new { C = new string[0].AsEnumerable(), a.L }
        : new { C = new string[0].AsEnumerable(), L = a.L.Concat(new[] { a.C }) } 
        : a.C == null ? a : new { C = a.C.Concat(new[] { s }), a.L }).L
          .Where(l => l.Any());

// Test
foreach (var i in result)
  Console.WriteLine(String.Join(",", i.ToArray()));

关于c# - 使用 C#,LINQ 如何一次又一次地在标记之间选择项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/813560/

相关文章:

c# - 使用 DateDiff 和 Linq.Dynamic 库获取今天的记录

c# - 我如何获得一个实体及其所有相关实体

c# - 使用 LINQ 获取两个列表之间的差异

c# - VB.Net 和 C# 之间 LINQ 语法的差异

c# - 在 Autofac 服务注册期间修改 WCF 终结点行为

c# - 通过参数名称对 ArgumentNullException 进行单元测试

c# - 使用现有的哈希集作为键来创建新字典

c# - 在嵌套列表中按属性排序列表

c# - Entity Framework 5 从 4 升级

c# - YouTube 播放器不在播放列表中显示视频信息