2014-09-04 2 views
-1

хотя легко реализовано в течение цикла я ищу аккуратный LinQ способ реализации ниже Скажем, у меня есть этот списокреализация LINQ группы по группам

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

Было бы очень полезно, если вы показали y наш для каждого подхода - не очевидно, что вы пытаетесь достичь здесь. – decPL

+3

Если дело доходит до «prev-next», LINQ не подходит для работы. Это возможно, но за счет единственной цели LINQ: удобочитаемость. –

+0

Да звучит правильно, не будет использовать linq здесь (слишком плохо, что это длинный код здесь ...) :) – user1025852

ответ

0

Я согласен с @ Тим 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

NICE !! Я попробую это - спасибо, что поделился этим :) – user1025852

Смежные вопросы