加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么IOrderedEnumerable在过滤后没有保留顺序

发布时间:2020-12-15 20:01:06 所属栏目:百科 来源:网络整理
导读:我已经创建了一个简化问题的方法.我有一个有序的IEnumerable,我想知道为什么应用where过滤器可以对对象进行排序 这不会编译,而它应该具有潜力 IOrderedEnumerableint tmp = new Listint().OrderBy(x = x);//Error Cannot Implicitly conver IEnumerableint T
我已经创建了一个简化问题的方法.我有一个有序的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>的上下文中使用它.是必须的.

合理?

但是,当然,正如其他人所说,你几乎总是想先做过滤然后再做排序.这样你就不会花时间将物品整理成你要丢弃的物品.

当然,您必须先订购然后过滤;例如,查询“女性演唱的前十首歌曲”以及“女性演唱的前十首歌曲”的查询可能非常不同!第一个是歌曲排序 – >进入前十名 – >应用过滤器.第二个是应用过滤器 – >对歌曲进行排序 – >进入前十名.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读