【问题标题】:Iterate through each rows list properties遍历每行列表属性
【发布时间】:2016-02-14 17:56:29
【问题描述】:

我目前有以下代码:

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 行
Item1 名称 项目 1 值,
Item2 名称 Item 2 值,
Item3 名称 Item 3 值

到这里:

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

【问题讨论】:

  • 我假设您的意思是访问item 的属性,而不是每次迭代访问list 中的第一个条目?
  • 是的,我就是这个意思

标签: c#


【解决方案1】:

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

 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);
            }               
        }

【讨论】:

    【解决方案2】:

    如果您不想通过名称来引用 Property,则只能通过反射来实现。因为列表中的每个项目都有 6 个属性 -(Item1,Item2,...Item6)。

    或者,您可以使用并行 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);
    });
    

    【讨论】:

      猜你喜欢
      • 2019-01-25
      • 2016-05-26
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多