如何将foreach逻辑整合到生成匿名类型后的LINQ查询中?
问题描述
现有如下LINQ查询:
var query = from x in eksList // 此处包含其他join等逻辑 select new { Val = x.Something, Name = y.OtherThing, };
随后通过foreach遍历该查询结果,根据匿名对象的Val值执行判断,将符合条件的Name添加到myfinalList:
foreach (var item in query) { if(SomeMethodCallResult(item.Val)) myfinalList.Add(item.Name); if(SomeOtherLogic(item.Val) > 232) myfinalList.Add(item.Name); }
需求是将上述foreach中的判断逻辑整合到原LINQ查询中,直接生成最终的myfinalList集合。
解决方案
场景1:保留原逻辑(满足两个条件时Name被添加两次)
原foreach中两个if是独立判断,若同时满足两个条件,同一个Name会被加入myfinalList两次。可以通过SelectMany将每个元素转换为可能包含0、1或2个Name的集合,再扁平化得到最终列表:
// 整合后的完整逻辑 var myfinalList = (from x in eksList // 保留原有的join等逻辑 select new { Val = x.Something, Name = y.OtherThing, }) .SelectMany(item => { var result = new List<string>(); if (SomeMethodCallResult(item.Val)) result.Add(item.Name); if (SomeOtherLogic(item.Val) > 232) result.Add(item.Name); return result; }) .ToList();
如果想用查询表达式结合into关键字,可这样实现:
var myfinalList = (from x in eksList // 保留原有的join等逻辑 select new { Val = x.Something, Name = y.OtherThing } into tempItem from name in new List<string>() { SomeMethodCallResult(tempItem.Val) ? tempItem.Name : null, SomeOtherLogic(tempItem.Val) > 232 ? tempItem.Name : null }.Where(n => n != null) select name) .ToList();
场景2:满足任意一个条件仅添加一次
如果实际需求是只要满足两个条件中的任意一个,就将Name添加一次(而非两次),可直接用Where过滤后提取Name:
var myfinalList = (from x in eksList // 保留原有的join等逻辑 select new { Val = x.Something, Name = y.OtherThing, }) .Where(item => SomeMethodCallResult(item.Val) || SomeOtherLogic(item.Val) > 232) .Select(item => item.Name) .ToList();
内容的提问来源于stack exchange,提问作者LonelySemiColon
相关产品推荐
相关产品推荐

