2014-06-10 16 views
-2

我在嘗試使用SkipWhile過濾對象,但它不評估多個條件。如何在多個條件下使用SkipWhile

下面是一個示例代碼演示問題,

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

此查詢選擇2,3,4,5,其省略了第二個條件(n != 2)中,當所述第一條件是true

是否有可能使查詢評估兩個條件?

編輯:

我的實際情況是像

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

這是經營上的日期時間申請,在列表中選擇下一個對象

編輯2:

我創建了一個示例程序,這是一個SIM卡ILAR到我的實際代碼

類保存數據,

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

計劃

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); 
     } 

回答

6

評估兩個條件 - 但只要條件爲false,對其餘序列被返回。只要n==2,n < 2 && n != 2false。事實上,你的情況是沒有意義呢 - 如果n小於二不能等於2

基本上目前還不清楚你想達到什麼樣的,但條件你使用是不恰當的 - 如果你想檢查你的病情每價值,而不是僅僅「值,直到條件不符合」,那麼你應該使用Where代替SkipWhile.

編輯:既然你已經發布了一個完整的例子,我們可以看到有什麼不對。看看你的條件:

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

現在看看你的數據的第一項:

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

而且myDate

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

是您的病情通過數據的第一項滿意?不,因爲ToDate(1月31日)是而不是大於或等於myDate(2月10日)。因此,SkipWhile不會跳過任何項目。也許你想要||而不是&&? (目前還不清楚這個查詢是爲了達到什麼目的。)

+0

請檢查更新,我的實際需求是選擇當這兩個條件滿足下一個對象... – Nalaka526

+2

@ Nalaka526:嗯沒有關於您的數據的任何信息和你得到的結果,我們不能真正幫助你。我建議你編輯你的問題,以包括一個簡短的*完整的例子,展示這個問題。但我非常懷疑問題在於執行'SkipWhile'。 –

+0

我已經用示例代碼更新了問題,請檢查... – Nalaka526