2014-09-04 25 views
-1

虽然容易实现在for循环我正在寻找一个整洁LINQ的方式来实现以下 比方说,我有这个名单LINQ实施小组由集团

S1,S1,S1,S2,S2的, S1,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... 
} 
+1

这将是非常如果你已经向你展示过,那就很有用对于每种方法来说 - 这并不明显,你想在这里实现什么。 – decPL 2014-09-04 11:42:28

+3

如果涉及到“prev-next”,那么LINQ并不适合这项工作。这是可能的,但是以LINQ的唯一目的为代价:可读性。 – 2014-09-04 11:50:08

+0

是啊,听起来是正确的,不会在这里使用linq(太糟糕了,在这里这么长的代码...):) – user1025852 2014-09-04 12:06:18

回答

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

+0

好!我会尝试一下 - 感谢分享这:) – user1025852 2014-09-08 07:31:17