C# 分组的linq实现

C# 分组的linq实现,c#,linq,.net-4.5,C#,Linq,.net 4.5,虽然在for循环中很容易实现,但我正在寻找一种简洁的linq方法来实现下面的 假设我有这个清单 S1,S1,S1,S2,S2,S1,S1,S1,S1,S2=>{S1,S1,S1},{S2,S2},{S1,S1},{S2} 这是一件事。 除上述内容外,在“断开到组”时添加另一个条件(类似于prev,current logic) 我在每个循环中都使用了大量的代码——有人知道linq是否可以帮助这些子组划分吗 foreach (var item in group){ if (item.membe

虽然在for循环中很容易实现,但我正在寻找一种简洁的linq方法来实现下面的 假设我有这个清单

S1,S1,S1,S2,S2,S1,S1,S1,S1,S2=>{S1,S1,S1},{S2,S2},{S1,S1},{S2}

这是一件事。 除上述内容外,在“断开到组”时添加另一个条件(类似于prev,current logic)

我在每个循环中都使用了大量的代码——有人知道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可能不是适合这项工作的工具,因为我想不出一种方法可以像循环一样可读

我想到的一件事是。这将为
IEnumerable
中的每个元素调用一个函数,传递当前元素和上一次调用的返回值

类似于下面的东西会起作用,但它的作用(至少对我来说)一点也不明显。
(string)null
参数是传递给
func
的第一个值,因此我添加了对
previousString!=空

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));
}
List someList=新列表()
{
“S1”、“S1”、“S1”、“S2”、“S2”、“S1”、“S1”、“S1”、“S1”、“S1”、“S2”
};
列表组=新列表();
List currentGroup=新列表();
聚合((字符串)null,(previousString,currentString)=>
{
if(previousString!=null&¤tString!=previousString)
{
//这不是第一组
//值不同,表示一个新的组
添加(当前组);
currentGroup=新列表();
}
currentGroup.Add(currentString);
返回当前字符串;
});
添加(当前组);
foreach(组中的var组)
{
Console.WriteLine(string.Join(“,”,group));
}
这张照片

S1,S1,S1

S2,S2

S1,S1,S1

S2


如果你已经展示了你对每一种方法的看法,这将非常有帮助——你在这里试图实现的目标并不明显。如果涉及到“prev next”,LINQ不是适合这项工作的工具。这是可能的,但代价是LINQ的唯一目的:可读性。是的,听起来是正确的,不会在这里使用LINQ(太糟糕了,这里的代码太长了……)很好!!我会试试的-谢谢分享这个:)