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

使用LINQ获取SequenceShare的奇数-偶数部分

时间:2023-04-10 14:09:12 C#

使用LINQ获取序列的奇数/偶数部分假设我有一个所有项目的列表,我将它们按类别分组,如下所示:varprojectsByCat=frompinProjectsgrouppbyp.Categoryintogorderbyg.Count()descendingselectnew{Category=g.Key,Projects=g};现在我想在网页中将其显示为列表,首先创建左侧的div,然后创建右侧的div。我按每个类别的项目数排序以显示最顶层项目的类别-所以我想将itemsByCat分成两部分-如果我将所有“奇数”类别和“偶数”类别放在左侧在正确的类别上,我想我会得到一个合理的理智的观点。所以我想我可以这样做来获得项目projectsByCat的奇数和偶数成员:varoddCategories=projectsByCat.Where((cat,index)=>index%2!=0);varevenCategories=projectsByCat.Where((cat,index)=>index%2==0);它编译-但是,当我运行它时,我得到如下异常:查询运算符'Where'不支持重载。我认为我是安全的,因为它首先编译。;)有没有优雅的方法来做到这一点?而且,是否有一个优雅的解释为什么我对Where()的创造性使用不起作用?提前致谢!如果您正在使用LINQtoSQL或LINQtoEntities,您应该首先将结果完全具体化到内存中:varoddCategories=projectsByCat.ToList().Where((c,i)=>i%2!=0);varevenCategories=projectsByCat.ToList().Where((c,i)=>i%2==0);如果不使用ORM框架无法做到的游标,则无法使用索引器迭代数据库上的结果。请注意,为同一查询调用.ToList()两次将查询数据库两次。最好将结果缓存在中间列表中,然后应用谓词过滤:varprojectsByCat=(frompinProjectsgrouppbyp.Categoryintogorderbyg.Count()descendingselectnew{Category=g.Key,项目=g}).ToList();varoddCategories=projectsByCat.Where((cat,index)=>index%2!=0);varevenCategories=projectsByCat.Where((cat,index)=>index%2==0);oddCategories和evenCategories倒过来。索引从0而不是1开始0%2=00索引是奇数。varoddCategories=projectsByCat.Where((cat,index)=>index%2==0);varevenCategories=projectsByCat.Where((cat,index)=>index%2!=0);使用LINQ和避免多次输入枚举的正确方法是根据每个项目是偶数还是奇数或类似的东西进行分组。将Select的重载与ToLookup结合使用的简单方法可以为您提供所需的内容:varoddsAndEvens=input.ToList()//如果需要从IQueryable获取IEnumerable.Select((item,index)=>new{isEven=index%2!=0,项目}).ToLookup(i=>i.isEven,i=>i.item);这将生成具有以下好处的Lookup数据结构:如果在集合中找不到该键,则返回一个空序列。这意味着在上面的LINQ查询之后,您可以执行以下操作:varevens=oddsAndEvens[true];varodds=oddsAndEvens[false];您可以使用linq来分隔视图中的奇数和偶数。//even@foreach(variteminModel.Where((item,index)=>index%2==0)){//执行代码}//odd@foreach(variteminModel.Where((item,index)=>index%2!=0)){//执行代码}vars="这是一个测试字符串>用于提取奇数索引>拆分后的值";varl=s.Split(newchar[]{''};IEnumerablee=l.Where(x=>((l.ToList().IndexOf(x)%2)==1));'e'将是:'string'和'index'你可以在没有foreach循环的情况下找到偶数奇数上面是C#学习教程:使用LINQ获取序列共享的奇数/偶数部分如果它对你有用并且你需要了解更多C#学习教程,希望大家多多关注---staticvoidMain(string[]args){Listlstnum=newList{1,2,3,4,5,6,7,8,9,10};列表lstresult=lstnum.FindAll(x=>(x%2)==0);lsresult.ForEach(x=>Console.WriteLine(x));}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: