Linq与IOrderedEnumerable和Where有多聪明

And*_*ner 1 c# linq iorderedenumerable

所以,假设我有一个IEnumerable日期,我希望得到一个范围内的日期.

Linq和IOrderedEnumerable足够智能,可以实现选择更快算法的能力,因为现在订购了日期.

所以考虑一下:

IOrderedEnumerable<ObjectWith2DateTimes> orderedDates = dates.OrderBy(x => new Tuple(x.datetime1,x.datetime2));

...
this is called a bunch
...
    DateTime afterDateTime = (some datetime)
    DateTime beforeDateTime = (other datetime)
    yield return orderedDates.Where(x => x.datetime1 >= afterDateTime && x.datetime2 <= beforeDateTime)
Run Code Online (Sandbox Code Playgroud)

如果这个实现不聪明,是否还有一些其他实现可以使它变得聪明?

Han*_*ans 5

不,这样做不够聪明.Enumerable.Where <TSource>接受Func <TSource,bool>,而不是像Queryable.Where <TSource>那样的Expression <Func <TSource,bool >>.所以你可以用IQueryable来做,但是你需要一个能够做到这一点的查询提供者.这可能不值得麻烦.

但是,这样的事情应该做:

orderedDates
    .SkipWhile(x => x.datetime1 < afterDateTime)
    .TakeWhile(x => x.datetime2 > beforeDateTime)
Run Code Online (Sandbox Code Playgroud)