如何使用LINQ从列表中选择各种长度的部分

时间:2013-06-21 10:31:41

标签: c# .net linq

我有一个列表(它可能是复杂类型的列表,但为了更好的想法解释,我将使用字符串)。

编辑: 请不要为我提供拆分方法解决方案。它们完全没用。我有一个复杂类型的列表,字符串只是简化

有一些重复的元素表示新部分的开始。每个部分可能有不同的长度。

示例:

(在我的实际问题中 - 每个字符串都是复杂类型的一部分)

class Complex
{
  public string Header { get; set; }
  ...
  ...
  ...
}

开始 1 2 3 4 五 6 7 开始 1 2 3 开始 1 2 3 4 五 6 开始 1 开始 1 2

我想使用LINQ获取所有可能的列表。我的意思是

  • 1 2 3 4 5 6 7
  • 1 2 3
  • 1 2 3 4 5 6
  • 1
  • 1 2

如何仅使用LINQ执行此操作?

2 个答案:

答案 0 :(得分:4)

使用GroupAdjacent方法,提供MoreLinq

var strings = new []{"start","1","2","3","4","5","6","7",
                     "start","1","2","3",
                     "start","1","2","3","4","5","6",
                     "start","1",
                     "start","1","2"};

strings.GroupAdjacent(v => v != "start")
       .Where(grp => grp.Key) //skip "start" items
       .ForEach(groupItems => Console.WriteLine(string.Join(" ", groupItems)));

打印:

1 2 3 4 5 6 7
1 2 3
1 2 3 4 5 6
1
1 2

MoreLinq还提供了Split扩展方法:

strings.Split("start")
       .Where(grp => grp.Any()) //skip first item as empty collection 
       .ForEach(groupItems => Console.WriteLine(string.Join(" ", groupItems)));

将打印相同的

答案 1 :(得分:0)

试试这种方式

YourList.Split('start').ToList();

希望这会有所帮助。