虽然很容易在for循环中实现,但我正在寻找一种巧妙的linq方式来实现下面的内容 我们说我有这个清单
S1,S1,S1,S2,S2,S1,S1,S1,S2 => {S1,S1,S1},{S2,S2},{S1,S1},{S2}
这是一回事。 除上述内容外,还可以在"打破Group" (像prev,当前的逻辑)
我为每个循环编写了大量代码 - 是否有人知道linq是否可以帮助这些子组划分?
foreach (var item in group){
if (item.member1 != prev.member1 || item.member2 - prev.member2 > 88)
cut the group till prev item...
}
答案 0 :(得分:0)
我同意@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