linq按群组实施

时间:2014-09-04 11:40:52

标签: c# linq .net-4.5

虽然很容易在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...
}

1 个答案:

答案 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