当前位置:  开发笔记 > 编程语言 > 正文

使用LINQ获取序列的奇数/偶数部分

如何解决《使用LINQ获取序列的奇数/偶数部分》经验,为你挑选了3个好方法。

假设我有一个所有的列表Projects,并且我将它们分组为Category:

var projectsByCat = from p in Projects
                    group p by p.Category into g
                    orderby g.Count() descending
                    select new { Category = g.Key, Projects = g };

现在我想将其显示为网页中的列表,首先我创建左侧div,其次是右侧div.我按Projects每个号码排序Category以显示Categories最多的Projects- 因此我想分成projectsByCat两部分 - 如果我把所有"奇数编号" Categories放在左边而"偶数编号"类别放在右边,我我想我会得到一个相当理智的观点.

所以我认为我可以做到这一点,以获得奇数和偶数成员projectsByCat:

var oddCategories = projectsByCat.Where((cat, index) => index % 2 != 0);

var evenCategories = projectsByCat.Where((cat, index) => index % 2 == 0);

它编译 - 然而,当我运行它时,我得到一个例外,如下所示:

用于查询运算符'Where'的不支持的重载.

我认为自从它首先编译后我就安全了.;)

有一种优雅的方式来做到这一点?而且,是否有一个优雅的解释为什么我的创造性使用Where()不起作用?

提前致谢!



1> Mark Cidade..:

如果您正在使用LINQ to SQL或LINQ to Entities,则应首先将结果完全实现到内存中:

var oddCategories  = projectsByCat.ToList().Where((c,i) => i % 2 != 0);
var evenCategories = projectsByCat.ToList().Where((c,i) => i % 2 == 0);

使用索引器迭代数据库上的结果是不可能的,而不使用ORM框架不能执行的游标.



2> Jacob Carpen..:

请注意,.ToList()对同一查询调用两次将查询数据库两次.

将结果缓存到中间列表中会更好,然后应用谓词过滤:

var projectsByCat =
    (from p in Projects
    group p by p.Category into g
    orderby g.Count() descending
    select new { Category = g.Key, Projects = g }).ToList();

var oddCategories = projectsByCat.Where((cat, index) => index % 2 != 0);
var evenCategories = projectsByCat.Where((cat, index) => index % 2 == 0);



3> 小智..:

oddCategories和evenCategories是向后的.

索引从0开始而不是1

0%2 = 0

0指数是奇数.

var oddCategories  = projectsByCat.Where((cat, index) => index % 2 == 0);

var evenCategories = projectsByCat.Where((cat, index) => index % 2 != 0);

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有