C# 如何在多种条件下使用SkipWhile

C# 如何在多种条件下使用SkipWhile,c#,.net,linq,C#,.net,Linq,我试图用SkipWhile过滤对象,但它不会计算多个条件 下面是演示该问题的示例代码 int[] numbers = { 1, 2, 3, 4, 5 }; var result = numbers.SkipWhile(n => n < 2 && n != 2).ToList(); 在DateTime字段上操作,以选择列表中的下一个对象 编辑2: 我创建了一个示例程序,它与我的实际代码类似 类来保存数据 public class DateRange {

我试图用
SkipWhile
过滤对象,但它不会计算多个条件

下面是演示该问题的示例代码

int[] numbers = { 1, 2, 3, 4, 5 };
var result = numbers.SkipWhile(n => n < 2 && n != 2).ToList();
在DateTime字段上操作,以选择列表中的下一个对象

编辑2:

我创建了一个示例程序,它与我的实际代码类似

类来保存数据

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);
        }
static void Main(字符串[]args)
{
var dateRanges=新列表(){
new DateRange{Sequence=1,FromDate=new DateTime(2014,1,1),ToDate=new DateTime(2014,1,31)},
新的日期范围{Sequence=2,FromDate=new DateTime(2014,2,1),ToDate=new DateTime(2014,2,28)},
新的日期范围{Sequence=3,FromDate=new DateTime(2014,3,1),ToDate=new DateTime(2014,3,31)},
新的日期范围{Sequence=4,FromDate=new DateTime(2014,4,1),ToDate=new DateTime(2014,4,30)},
新的日期范围{Sequence=5,FromDate=new DateTime(2014,5,1),ToDate=new DateTime(2014,5,31)},
};
var myDate=new DateTime(2014,2,10);//工厂中的日期
//此查询选择{22014/2/112014/2/28}
var selectedItem=dateRanges.OrderBy(d=>d.Sequence)
.其中(d=>d.FromDate=myDate)
.First();
//我实际需要选择的是{3,2014/3/1,2014/3/31}
//下一项是什么
//这就是我尝试过的
//但是这个查询也选择了{22014/2/12014/2/28}
var nextItem=dateRanges.OrderBy(d=>d.Sequence)
.SkipWhile(d=>d.FromDate=myDate)
.Skip(1.First();
//因为,这部分查询的结果返回来自{1,2014/1/1,2014/1/31}的对象。。。
var unexpecteditems=dateRanges.OrderBy(d=>d.Sequence)
.SkipWhile(d=>d.FromDate=myDate);
}
它正在评估这两个条件-但一旦条件为
false
,则返回序列的其余部分。只要
n==2
n<2&&n!=2
。事实上,你的条件没有任何意义——如果
n
小于2,它就不能等于2

基本上不清楚您想要实现什么,但是您使用的条件不合适-如果您想检查每个值的条件,而不是“直到条件不满足为止的值”,那么您应该使用
Where
而不是
SkipWhile.

编辑:现在您已经发布了一个完整的示例,我们可以看到哪里出了问题。看看你的情况:

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

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

第一项数据是否满足您的条件?否,因为
ToDate
(1月31日)不大于或等于
myDate
(2月10日)。因此,
SkipWhile
不会跳过任何项目。也许你想要
|
而不是
&&
?(现在还不清楚这个查询的目的是什么。)

请检查更新,我的实际要求是在两个条件都满足时选择下一个对象…@Nalaka526:如果没有关于您的数据和结果的任何信息,我们真的无法帮助您。我建议你编辑你的问题,包括一个简短但完整的例子来演示这个问题。我非常怀疑问题是
SkipWhile
的实现。@Nalaka526:我编辑了我的答案,以解释为什么会得到结果。基本上我认为你需要更仔细地考虑你的病情。
new DateRange{Sequence = 1 , FromDate = new DateTime(2014,1,1),
                             ToDate = new DateTime(2014,1,31)},
var myDate = new DateTime(2014, 2, 10);