如何在List<T>对象初始化中实现If Else条件逻辑?
解决方案
你之前的写法存在两个问题:一是对象初始化器语法不允许直接编写if语句;二是三元运算符的类型不匹配(比如FailureCount如果是string类型,右侧的true是布尔值,会导致编译错误)。针对多分支逻辑的需求,以下是几种可行的实现方式:
1. 使用Switch表达式(C# 8.0及以上版本)
这种方式适合简洁的多分支赋值场景,直接在属性初始化中编写分支逻辑:
List<TransmissionRes> rawr = (from DataRow dr in table.Rows select new TransmissionRes() { FailureCount = data switch { "1" => dr.Field<string>("对应字段名"), // data为"1"时的赋值逻辑 "2" => dr.Field<string>("FailureCount"), // data为"2"时的赋值逻辑 _ => null // 其他情况的默认值,可根据需求调整 }, // 其他属性的初始化代码... }).ToList(); return rawr;
2. 将分支逻辑抽离为独立方法
如果分支内的逻辑较为复杂(比如需要执行计算、调用其他方法等),把逻辑封装成独立方法会让代码更易维护:
// 定义处理逻辑的方法 private string GetFailureCount(string data, DataRow dr) { switch(data) { case "1": // 执行data为"1"时的逻辑,例如读取其他字段、计算值等 return dr.Field<string>("其他字段名"); case "2": return dr.Field<string>("FailureCount"); default: return string.Empty; // 默认返回值,按需调整 } } // 在LINQ查询中调用方法 List<TransmissionRes> rawr = (from DataRow dr in table.Rows select new TransmissionRes() { FailureCount = GetFailureCount(data, dr), // 其他属性初始化... }).ToList(); return rawr;
3. 使用LINQ Select的语句体形式
如果需要在初始化对象前执行更多操作(比如给多个属性赋值、执行额外逻辑),可以用语句体代替表达式形式:
List<TransmissionRes> rawr = table.Rows.Cast<DataRow>().Select(dr => { var res = new TransmissionRes(); switch(data) { case "1": // data为"1"时的完整逻辑,可同时给多个属性赋值 res.FailureCount = dr.Field<string>("字段A"); res.AnotherProperty = "自定义值A"; break; case "2": res.FailureCount = dr.Field<string>("FailureCount"); res.AnotherProperty = "自定义值B"; break; default: res.FailureCount = null; res.AnotherProperty = "默认值"; break; } // 通用属性的初始化 res.Id = dr.Field<int>("Id"); return res; }).ToList(); return rawr;
补充说明
- 如果
data是每个DataRow中的字段(而非外部变量),只需将代码中的data替换为dr.Field<string>("data")即可。 - 确保属性赋值的类型匹配,比如
FailureCount如果是字符串类型,不要赋值布尔值(像你之前三元运算符里的true),要使用对应类型的值。
内容的提问来源于stack exchange,提问作者新Acesyyy
相关产品推荐
相关产品推荐

