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

如何将C#中的foreach循环改写为等效LINQ语句?

C# 带条件foreach转LINQ实现方案

你当前写的dtos.Any(x => x.sample1 != SelectedDto.sample2)仅能判断集合中是否存在满足过滤条件的元素,属于布尔判断逻辑,会在找到第一个符合条件的元素时就短路返回,既不会遍历全量集合,也无法完成字符串拼接、追加到adi实例的操作,和你要实现的需求不匹配。

要完全对齐原foreach的执行逻辑,有两种常用实现:

  • 写法1:Where筛选+遍历追加(首推,性能、可读性最优)
    先用LINQ的Where过滤掉不需要处理的元素,再逐行调用AppendLine,和原代码执行逻辑完全一致,不会产生额外的内存开销:
    foreach (var targetItem in dtos.Where(item => item.sample1 != SelectedDto.sample2))
    {
        adi.AppendLine($"{targetItem.sample3} , {targetItem.sample1} , {targetItem.sample4}");
    }
    
    // 也可以把字符串拼接逻辑放到Select投影中,代码更简洁:
    // foreach (var line in dtos.Where(item => item.sample1 != SelectedDto.sample2).Select(item => $"{item.sample3} , {item.sample1} , {item.sample4}"))
    // {
    //     adi.AppendLine(line);
    // }
    
  • 写法2:链式ForEach调用(适合追求极简代码的场景)
    如果不想写显式foreach块,可以在筛选、投影后转成List,调用List自带的ForEach方法批量执行追加操作:
    dtos.Where(item => item.sample1 != SelectedDto.sample2)
        .Select(item => $"{item.sample3} , {item.sample1} , {item.sample4}")
        .ToList()
        .ForEach(line => adi.AppendLine(line));
    

避坑提示:不要用LINQ的Aggregate方法一次性拼接所有字符串再整体追加,这种方式会生成大量临时字符串对象,集合数据量大时性能明显差于逐行Append的写法,也和原代码逐行追加的执行逻辑存在差异。

内容的提问来源于stack exchange,提问作者Zeynep Aydemir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:54:19