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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 13:43:04