遍历每个行列表属性

时间:2016-02-14 17:56:30

标签: c#

我目前有以下代码:

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名称项目2值,
Item3名称项目3值

对此:

第1行 Item1名称项目1值
第2行 Item2名称项目2值
第3行 Item3名称项目3值

2 个答案:

答案 0 :(得分: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);
});

答案 1 :(得分:2)

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

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