循环访问每行列表属性

本文关键字:列表 属性 访问 循环 | 更新日期: 2023-09-27 18:34:30

我目前有以下一段代码:

public string ReplaceData(List<ListData> list, string emailBody)
{
    foreach (var item in list)
    {
        emailBody = emailBody.Replace("<Item1>", list.FirstOrDefault().Item1);
        emailBody = emailBody.Replace("<Item2>", list.FirstOrDefault().Item2);
        emailBody = emailBody.Replace("<Item3>", list.FirstOrDefault().Item3);
        emailBody = emailBody.Replace("<Item4>", list.FirstOrDefault().Item4);
        emailBody = emailBody.Replace("<Item5>", list.FirstOrDefault().Item5);
        emailBody = emailBody.Replace("<Item6>", list.FirstOrDefault().Item6);
    }
    ...
}

是否可以循环访问列表的每一行属性,获取每个属性名称和值,而不是每次都重复上述替换,因此只需要一个替换,因为它将逐个循环遍历每行属性,而不是每一行及其所有包含的属性?

我以前从未这样做过,因此如果需要,我可以提供其他信息。这需要尽可能高效,因为平均而言,我将有大约 15,000 行数据要迭代,因此反射可能不是实现我想要的最有效方法。

当前列表需要从中更改:

第 1 行
项目1 名称 项目 1 值,
项目 2 名称 项目 2 值,
项目3 名称 项目 3 值

对此:

第 1 行
项目1 名称 项目 1 值
第 2 行
项目2 名称 项目 2 值
第 3 行
项目3 名称 项目 3 值

循环访问每行列表属性

像这样的事情怎么样(使用反射(:

 public string ReplaceData(List<ListData> list, string emailBody)
    {
        foreach (var item in list)
        {           
            foreach (var property in item.GetType().GetProperties())
            {                 
                string stringToReplace = string.Format("<{0}>", property.Name.ToString());
                string valueToReplaceWith = property.GetValue(item, null).ToString();
                emailBody = emailBody.Replace(stringToReplace, valueToReplaceWith);
            }               
        }

如果您不想通过名称引用属性,则只能通过反射来执行此操作。因为列表中的每个项目都有 6 个属性 -(项目1,项目2,...项目6(。

或者,您可以使用并行foreach,这可能会加快

Parallel.ForEach(list,(item) =>
{
    emailBody = emailBody.Replace("<Item1>", list.FirstOrDefault().Item1);
    emailBody = emailBody.Replace("<Item2>", list.FirstOrDefault().Item2);
    emailBody = emailBody.Replace("<Item3>", list.FirstOrDefault().Item3);
    emailBody = emailBody.Replace("<Item4>", list.FirstOrDefault().Item4);
    emailBody = emailBody.Replace("<Item5>", list.FirstOrDefault().Item5);
    emailBody = emailBody.Replace("<Item6>", list.FirstOrDefault().Item6);
});