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
相关产品推荐
相关产品推荐

