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

Posted

技术标签:

【中文标题】如何使用 LINQ 从列表中选择各种长度的部分 [关闭]【英文标题】:How to select various-length sections from list using LINQ [closed] 【发布时间】:2013-06-21 10:31:41 【问题描述】:

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

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

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

例子:

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

class Complex

  public string Header  get; set; 
  ...
  ...
  ...

开始 1 2 3 4 5 6 7 开始 1 2 3 开始 1 2 3 4 5 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 来做到这一点?

【问题讨论】:

你有什么尝试吗? 我可以在没有 LINQ 的情况下做到这一点。我有一个对象列表。但如果算法适用于字符串,它将适用于其他所有内容 这仅适用于字符串 【参考方案1】:

使用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)));

将打印相同的

【讨论】:

我只能使用纯 Linq,没有额外的库 @BorysławBobulski 请问为什么会这样? (MoreLinq是开源的,所以你可以使用他们的源码,编译运行) 我尽量减少代码长度,这是一个非常简单的问题。请忘记这个问题,在这里寻找这个问题的新版本:***.com/questions/17233681/… @BorysławBobulski 最好澄清您现有的问题,而不是发布新版本 不,因为如果问题的声誉不佳,就没有办法鼓励任何人找到解决方案【参考方案2】:

试试这个方法

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

希望这会有所帮助。

【讨论】:

不,不会。问题不在于字符串,而在于复杂对象。例如,我有一个具有一个 Header 属性的类,并且有一个字符串。

以上是关于如何使用 LINQ 从列表中选择各种长度的部分 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 从数据集中选择行,其中 RowsID 的列表位于 List<T>

Linq通过搜索关键字从对象的关系列表中选择对象

从 Linq 的列表中选择多个字段

如何使用 LINQ 从对象列表中获取唯一的属性列表?

C# LINQ 从数组/列表中不包含值的位置选择

C# LINQ 从字符串数组列表中选择