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

假设我有一个所有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。 我按每个CategoryProjects数量排序,以显示最顶层ProjectsCategories – 因此我想将itemsByCat拆分为两个 – 如果我将所有“奇数编号” 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); 

使用LINQ执行此操作并避免输入多次枚举的正确方法是对每个项目是偶数还是奇数进行分组或类似操作。

使用与ToLookup结合使用的Select的重载的简单方法可以为您提供所需的内容:

 var oddsAndEvens = input .ToList() // if necessary to get from IQueryable to IEnumerable .Select((item, index) => new { isEven = index % 2 != 0, item }) .ToLookup( i => i.isEven, i => i.item); 

这将生成一个Lookup数据结构,具有以下好处 :

如果在集合中找不到密钥,则返回空序列。

这意味着在上面的LINQ查询之后你可以这样做:

 var evens = oddsAndEvens[true]; var odds = oddsAndEvens[false]; 

您可以使用linq在视图中分离奇数和偶数。

 //even @foreach (var item in Model.Where((item, index) => index % 2 == 0)) { //do the code } //odd @foreach (var item in Model.Where((item, index) => index % 2 != 0)) { //do the code } 

var s =“这是一个测试< string >用于在拆分后提取奇数< index >值”; var l = s.Split(new char [] {'<','>'}; IEnumerable e = l.Where(x =>((l.ToList()。IndexOf(x)%2)== 1) );'e'将是:'string'和'index'

你可以找到偶数奇数没有foreach循环

 static void Main(string[] args) { List lstnum = new List { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; List lstresult = lstnum.FindAll(x => (x % 2) == 0); lstresult.ForEach(x => Console.WriteLine(x)); }