我已经创建了一个简化问题的方法.我有一个有序的IEnumerable,我想知道为什么应用where过滤器可以对对象进行排序
这不会编译,而它应该具有潜力
IOrderedEnumerable<int> tmp = new List<int>().OrderBy(x => x); //Error Cannot Implicitly conver IEnumerable<int> To IOrderedEnumerable<int> tmp = tmp.Where(x => x > 1);
据我所知,如果来自IQueryable,例如使用linq到某个DB Provider,就没有gaurenteed执行顺序.
但是,在处理Linq To Object时会发生什么样的事件会导致对象无序,或者为什么不实现?
编辑
我理解如何正确地订购这不是问题.我的问题更多的是一个设计问题.对linq到对象的where过滤器应枚举给定枚举和应用过滤.那么为什么我们只能返回IEnumerable而不是IOrderedEnumerable?
编辑
澄清这个有用的时候.我正在根据代码中的条件构建查询,我想尽可能多地重用代码.我有一个返回OrderedEnumerable的函数,但是在应用了额外的地方之后我将不得不重新排序它,即使它将处于其原始的有序状态
解决方法
Rene的回答是正确的,但可以使用一些额外的解释.
IOrderedEnumerable< T>并不意味着“这是一个有序的序列”.这意味着“这是一个已经应用了订购操作的序列,您现在可以使用ThenBy来强制执行额外的订购要求.”
Where的结果不允许您使用ThenBy跟进它,因此您不能在IOrderedEnumerable< T>的上下文中使用它.是必须的.
合理?
但是,当然,正如其他人所说,你几乎总是想先做过滤然后再做排序.这样你就不会花时间将物品整理成你要丢弃的物品.
当然,您必须先订购然后过滤;例如,查询“女性演唱的前十首歌曲”以及“女性演唱的前十首歌曲”的查询可能非常不同!第一个是歌曲排序 – >进入前十名 – >应用过滤器.第二个是应用过滤器 – >对歌曲进行排序 – >进入前十名.