如何使用 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 从列表中选择各种长度的部分 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章