How to use SkipWhile with multiple conditions

I'm trying to filter objects with SkipWhile but it does not evaluate multiple conditions.

Below is a sample code demonstrating the issue,

int[] numbers = { 1, 2, 3, 4, 5 };
var result = numbers.SkipWhile(n => n < 2 && n != 2).ToList();

This query selects 2,3,4,5, which omits the second condition (n != 2), when the first condition is true.

Is it possible to make the query evaluate both conditions?

Edit:

My actual condition is something like

... dateRanges
     .OrderBy(d=>d.Sequence)
     .SkipWhile(d => d.FromDate <= currentDate && d.ToDate >= currentDate)
     .Skip(1).First();

which is operating on DateTime filed, to select next object in the list

Edit 2:

I have created a sample program, which is something similar to my actual code

Class to hold data,

public class DateRange
    {
        public int Sequence { get; set; }
        public DateTime FromDate { get; set; }
        public DateTime ToDate { get; set; }
    }

Program

static void Main(string[] args)
        {

            var dateRanges = new List<DateRange>(){
                new DateRange{Sequence = 1 , FromDate = new DateTime(2014,1,1), ToDate = new DateTime(2014,1,31)},
                new DateRange{Sequence = 2 , FromDate = new DateTime(2014,2,1), ToDate = new DateTime(2014,2,28)},
                new DateRange{Sequence = 3 , FromDate = new DateTime(2014,3,1), ToDate = new DateTime(2014,3,31)},
                new DateRange{Sequence = 4 , FromDate = new DateTime(2014,4,1), ToDate = new DateTime(2014,4,30)},
                new DateRange{Sequence = 5 , FromDate = new DateTime(2014,5,1), ToDate = new DateTime(2014,5,31)},
            };

            var myDate = new DateTime(2014, 2, 10); // A Date in Fabruary

            //This query selects {2, 2014/2/1, 2014/2/28}
            var selectedItem = dateRanges.OrderBy(d => d.Sequence)
                      .Where(d => d.FromDate <= myDate && d.ToDate >= myDate)
                      .First();

            //What I actually need to select is {3, 2014/3/1, 2014/3/31}
            //Which is next item of the list

            //This is what i have tried
            //But this query also selects {2, 2014/2/1, 2014/2/28}
            var nextItem = dateRanges.OrderBy(d => d.Sequence)
                  .SkipWhile(d => d.FromDate <= myDate && d.ToDate >= myDate)
                  .Skip(1).First();

            //Because, results of this part of query returns objects from {1, 2014/1/1, 2014/1/31} ...
            var unexpectdItems = dateRanges.OrderBy(d => d.Sequence)
                  .SkipWhile(d => d.FromDate <= myDate && d.ToDate >= myDate);
        }
Jon Skeet
people
quotationmark

It is evaluating both conditions - but as soon as the condition is false, the rest of the sequence is returned. As soon as n==2, n < 2 && n != 2 is false. In fact, your condition makes no sense anyway - if n is less than 2 it can't be equal to 2.

Basically it's not clear what you're trying to achieve, but the condition you're using isn't appropriate - and if you want to check your condition on every value rather than just "values until the condition isn't met" then you should use Where instead of SkipWhile.

EDIT: Now that you've posted a complete example, we can see what's wrong. Look at your condition:

SkipWhile(d => d.FromDate <= myDate && d.ToDate >= myDate)

Now look at the first item of your data:

new DateRange{Sequence = 1 , FromDate = new DateTime(2014,1,1),
                             ToDate = new DateTime(2014,1,31)},

And myDate:

var myDate = new DateTime(2014, 2, 10);

Is your condition satisfied by the first item of your data? No, because ToDate (January 31st) is not greater than or equal to myDate (February 10th). So no items are skipped by SkipWhile. Perhaps you wanted || instead of &&? (It's still not clear what this query is meant to achieve.)

people

See more on this question at Stackoverflow