假设我有一个所有的列表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()
不起作用?
提前致谢!
如果您正在使用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框架不能执行的游标.
请注意,.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);
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);