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

C#中从IEnumerable读取数据并动态添加到List的代码优化咨询

优化方案分析

你的代码功能正常,但在对象初始化、代码复用和简洁性上有不少可以优化的地方,下面逐一说明并给出改进后的代码:

1. 移除多余的临时对象

你在循环外初始化的userLogin对象完全没必要——每次循环里只是给它的属性赋值,然后立刻用这些值新建一个LoadBOUserLogin实例。直接在循环里处理完字符串就创建目标对象就行,省去这个中间对象。

2. 提取重复的字符串处理逻辑

三个字段的清洗逻辑完全一致,把这部分抽成一个工具方法,既能减少重复代码,也方便后续修改规则。

3. 修复异常处理的堆栈信息

catch里直接throw ex会丢失原始异常的堆栈跟踪,改成直接throw就能保留完整的错误信息,方便调试。

4. 简化变量初始化

初始的items不需要提前赋值为空列表,直接声明变量,后续从数据库查询后赋值即可。

5. 用LINQ替代foreach循环(可选)

如果追求代码简洁,可以用LINQ的Select方法直接将DTO转换并清洗后转成List,代码更紧凑。


改进后的代码

首先添加字符串清洗的工具方法(可以放在当前类里,或者单独的工具类中):

private static string CleanString(string input)
{
    // 处理null值,过滤非法字符并去除首尾空格
    return Regex.Replace(input ?? string.Empty, @"[^	

 -~]", string.Empty).Trim();
}

然后修改主方法,这里提供两种实现方式:

方式一:优化后的foreach版本

public class LoadBOUserLogin
{
    public string LOGIN_ID { get; set; }
    public string EMP_ID { get; set; }
    public string CODE { get; set; }

    public LoadBOUserLogin() { }
    public LoadBOUserLogin(string loginId, string empId, string code)
    {
        LOGIN_ID = loginId;
        EMP_ID = empId;
        CODE = code;
    }
}

private static IEnumerable<LoadBOUserLogin> LoadBOUserLogin()
{
    IEnumerable<DTO.BOUserLogin> items;
    var userLoginList = new List<LoadBOUserLogin>();

    try
    {
        const string strQuery = @"[dbo].[BOUSER_SEL_Login]";

        using (SqlConnection con = new SqlConnection(Connections.GetConnectionString()))
        {
            items = con.Query<DTO.BOUserLogin>(strQuery, commandTimeout: 120, commandType: System.Data.CommandType.StoredProcedure);
        }

        foreach (var x in items)
        {
            // 直接清洗后创建对象并添加到集合
            var cleanedLogin = new LoadBOUserLogin(
                CleanString(x.LOGIN_ID),
                CleanString(x.EMP_ID),
                CleanString(x.CODE)
            );
            userLoginList.Add(cleanedLogin);
        }
    }
    catch (Exception)
    {
        // 直接throw保留堆栈信息
        throw;
    }

    return userLoginList;
}

方式二:LINQ版本(更简洁)

private static IEnumerable<LoadBOUserLogin> LoadBOUserLogin()
{
    try
    {
        const string strQuery = @"[dbo].[BOUSER_SEL_Login]";

        using (SqlConnection con = new SqlConnection(Connections.GetConnectionString()))
        {
            var items = con.Query<DTO.BOUserLogin>(strQuery, commandTimeout: 120, commandType: System.Data.CommandType.StoredProcedure);
            
            // 用Select直接转换并清洗,最后转成List
            return items.Select(x => new LoadBOUserLogin(
                CleanString(x.LOGIN_ID),
                CleanString(x.EMP_ID),
                CleanString(x.CODE)
            )).ToList();
        }
    }
    catch (Exception)
    {
        throw;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:55:42