我@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
这将是非常如果你已经向你展示过,那就很有用对于每种方法来说 - 这并不明显,你想在这里实现什么。 – decPL 2014-09-04 11:42:28
如果涉及到“prev-next”,那么LINQ并不适合这项工作。这是可能的,但是以LINQ的唯一目的为代价:可读性。 – 2014-09-04 11:50:08
是啊,听起来是正确的,不会在这里使用linq(太糟糕了,在这里这么长的代码...):) – user1025852 2014-09-04 12:06:18