Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

LINQ - is SkipWhile broken?

I'm a bit surprised to find the results of the following code, where I simply want to remove all 3s from a sequence of ints:

var sequence = new [] { 1, 1, 2, 3 }; var result = sequence.SkipWhile(i => i == 3); // Oh noes! Returns { 1, 1, 2, 3 } 

Why isn't 3 skipped?

My next thought was, OK, the Except operator will do the trick:

var sequence = new [] { 1, 1, 2, 3 }; var result = sequence.Except(i => i == 3); // Oh noes! Returns { 1, 2 } 

In summary,

  • Except removes the 3, but also removes non-distinct elements. Grr.
  • SkipWhile doesn't skip the last element, even if it matches the condition. Grr.

Can someone explain why SkipWhile doesn't skip the last element? And can anyone suggest what LINQ operator I can use to remove the '3' from the sequence above?

like image 719
Judah Gabriel Himango Avatar asked Mar 26 '10 22:03

Judah Gabriel Himango


1 Answers

It's not broken. SkipWhile will only skip items in the beginning of the IEnumerable<T>. Once that condition isn't met it will happily take the rest of the elements. Other elements that later match it down the road won't be skipped.

int[] sequence = { 3, 3, 1, 1, 2, 3 }; var result = sequence.SkipWhile(i => i == 3);  // Result: 1, 1, 2, 3 
like image 134
Ahmad Mageed Avatar answered Sep 19 '22 14:09

Ahmad Mageed