linq实现了分组的分组
本文关键字:实现 linq | 更新日期: 2023-09-27 18:20:34
尽管在for循环中很容易实现,但我正在寻找一种简洁的linq方法来实现以下内容假设我有这个列表
S1,S1,S1、S2、S2、S1、S1、S2=>{S1、S1,S1}、{S2,S2}、{S1,S1}、{S2}
这是一回事。除了以上内容,在"分组"时添加另一个条件(类似于prev、当前逻辑)
我为每个循环使用了大量代码——有人知道linq是否可以帮助进行分组吗?
foreach (var item in group){
if (item.member1 != prev.member1 || item.member2 - prev.member2 > 88)
cut the group till prev item...
}
我同意@Tim Schmelter的评论,即LINQ可能不是适合这里工作的工具,因为我想不出一种像循环一样可读的方法。
脑海中浮现的一件事是Aggregate
。这将为IEnumerable
中的每个元素调用一个函数,传入当前元素和上一次调用的返回值。
类似于以下的东西会起作用,但它在做什么(至少对我来说)一点都不明显。(string)null
参数是传递给func
的第一个值,所以我添加了对previousString != null
的检查。
List<string> someList = new List<string>()
{
"S1", "S1", "S1", "S2", "S2", "S1", "S1", "S1", "S2"
};
List<List<string>> groups = new List<List<string>>();
List<string> currentGroup = new List<string>();
someList.Aggregate((string)null, (previousString, currentString) =>
{
if (previousString != null && currentString != previousString)
{
//it's not the first group
//and the value is different which denotes a new group
groups.Add(currentGroup);
currentGroup = new List<string>();
}
currentGroup.Add(currentString);
return currentString;
});
groups.Add(currentGroup);
foreach (var group in groups)
{
Console.WriteLine(string.Join(", ", group));
}
这将打印
S1,S1,S1
S2,S2
S1,S1,S1
S2