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...
}

linq实现了分组的分组

我同意@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