C# 如何使用 lambdas 或其他方法使用来自不同列表的值初始化列表 - 需要简化

Posted

技术标签:

【中文标题】C# 如何使用 lambdas 或其他方法使用来自不同列表的值初始化列表 - 需要简化【英文标题】:C# how to initialize list with values from different list using lambdas or something else -- need to simplify 【发布时间】:2021-10-09 00:58:27 【问题描述】:

我有以下代码,我想对其进行简化。 我需要填写临床医生的属性“角色”,这是一个角色模型列表,预期角色作为字符串提供=>它们需要用逗号分隔并转换为角色模型对象。 RoleModel 是字符串的枚举。

枚举看起来像这样:

public enum RoleModel

    ClinicManager = 1,
    ClinicAssistant = 2
    ...

specflow 数据表的输入数据如下所示:

| Roles                            |
| Clinic Assistant, Clinic Manager |

因此,我应用正则表达式来删除空格并将其拆分为一个列表,因为它需要转换为枚举,因为临床医生模型具有 RoleModel 值的列表“角色”。

目前我有这样的:

var expectedRolesString = row["Roles"];
var expectedRoles = Regex.Split(expectedRolesString.Replace(" ", ""), @"\s*[,;]\s*").ToList();

List<RoleModel> RoleList = new List<RoleModel>();
foreach (string role in expectedRoles)

   RoleList.Add(Enum.Parse<RoleModel>(role));


Clinician = new Clinician()

   List<RoleModel> Roles = RoleList 

我想像这样直接初始化列表,但不知道如何使用lambas或其他东西来获取所有字符串的解析值列表:( 有没有办法在创建列表时完成所有这些步骤?

Clinician = new Clinician()

   Roles = new List<RoleModel>()
   
      Enum.Parse<RoleModel>(Regex.Split(expectedRolesString.Replace(" ", ""), @"\s*[,;]\s*").ToList()[0]),
      Enum.Parse<RoleModel>(Regex.Split(expectedRolesString.Replace(" ", ""), @"\s*[,;]\s*").ToList()[1]),
      ...
    

【问题讨论】:

【参考方案1】:

看起来可能是这样的

Clinician = new Clinician()

   Roles = expectedRolesString.Split(',',';').Select(r => Enum.Parse<RoleModel>(r.Trim())).ToList()

或许

Clinician = new Clinician()

   Roles = expectedRolesString.Split(new[]',',';',' ', StringSplitOptions.RemoveEmptyEntries).Select(Enum.Parse<RoleModel>).ToList()

..但我希望查看输入数据和枚举定义以确保

【讨论】:

谢谢,我去看看。我在问题描述中为您添加了枚举和示例输入数据。 好的,您的第一个解决方案完美运行!你是神!我刚刚为 Replace() 更改了 Trim(),因为输入数据在字符串中间有空格。) 是的,该特定数据表示最简洁的可能是Roles = expectedRolesString.Replace(" ","").Split(',').Select(Enum.Parse&lt;RoleModel&gt;).ToList()

以上是关于C# 如何使用 lambdas 或其他方法使用来自不同列表的值初始化列表 - 需要简化的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 或其他模块在 C# 中连接两个查询的结果

lambda表达式来自哪里?

C#夯实基础-Lambda在List中的使用

如何将 C# lambda 表达式转换为委托?

如何使用 pinvoke 将图像从 c 或 c++ 发送到 C#

Lambda表达式