You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:34:57