当前位置: 首页 > 编程语言 > C#

LINQ保证排序SelectMany?分享

时间:2023-04-10 19:22:40 C#

LINQ保证订阅SelectMany?我有一个有序的枚举数组IOrderedEnumerable[]foo,我想将其展平,以便foo的有序枚举按照它们在数组中的存储顺序连接在一起。例如{{1,2,3},{4,5},{6}}=>{1,2,3,4,5,6}我可以通过IOrderedEnumerablebar=foo.SelectMany(x=>x);或者LINQ不保证在展平时订单将如何处理?一个列表(.net中用IEnumerable表示)和两个操作组成一个monad,必须遵守monad的规律。这两个操作在不同的语言中有不同的名称,维基百科的文章使用的是Haskell,它们被称为return和>>=(称为“绑定”)。C#调用>>=SelectMany,没有内置返回函数。名字不重要,重要的是类型。专门针对IEnumerable的是:]{物品};}SelectMany已实现为Enumerable.SelectMany:publicstaticIEnumerableSelectMany(IEnumerableseq,Func>f){...}SelectMany接受一个输入序列和一个为输入序列的每个项目生成另一个序列的函数,并展平sequences生成的sequences变成sequences。重申C#中的前两个monad法则,我们有:leftidentityFunc>f=...Return(x).SelectMany(f)==f(x)rightidentityIEnumerableseq=...seq.SelectMany(Return)==seq根据正确恒等律,SelectMany必须按照输入元素的顺序将Func>生成的每个序列展平。假设它以相反的顺序将它们展平,例如new[]{1,2}.SelectMany(i=>new[]{i,-i})==new[]{2,-2,1,-1}然后vars=new[]{1,2}s.SelectMany(Return)==new[]{2,1}!=s这不符合要求的权利身份法。所有LINQtoObjects方法(显然OrderBy()和ToDictionary()除外)都将保留源顺序。以上就是C#学习教程:LINQguaranteestoorderSelectMany?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: