如何动态克服列表对象的foreach循环

时间:2019-05-22 05:03:18

标签: c# .net list object dynamic

在某些情况下,我正在交换List Object中的值并更新List Object值。

当前,我正在做的是 -通过列表循环遍历每个对象 -检查条件是否为净 -交换值

buffer1

我可以采用更好的方法吗?我了解PropertyInfo,即可以检查属性名称和获取值等,但是没有任何提示可以完成此操作。

谢谢

2 个答案:

答案 0 :(得分:0)

这不完全是您要的,但是您可以在Where语句中合并这些子句,然后在主体中包含一些if语句:

public static void SwapMinMaxIfNull(this IEnumerable<RiskBoardDataToExport> rows, 
    string reportfor)
{
    if (rows = null) return;

    if (reportfor.Equals("Comparison", StringComparison.OrdinalIgnoreCase))
    {
        foreach (var row in rows.Where(r =>
            (r.MinGaitSpeed == null && r.MaxGaitSpeed != null) ||
            (r.MinBergScoreSpeed == null && r.MaxBergScoreSpeed != null) ||
            (r.MinBergScoreSpeed == null && r.MaxBergScoreSpeed != null)))
        {
            if (row.MinGaitSpeed == null)
            {
                row.MinGaitSpeed = row.MaxGaitSpeed;
                row.MaxGaitSpeed = null;
            }
            if (row.MinTUGTime == null)
            {
                row.MinTUGTime = row.MaxTUGTime;
                row.MaxTUGTime = null;
            }
            if (row.MinBergScoreSpeed == null)
            {
                row.MinBergScoreSpeed = row.MaxBergScoreSpeed;
                row.MaxBergScoreSpeed = null;
            }
        }
    }
}

答案 1 :(得分:0)

由于此操作对列表中项目的顺序无关紧要,因此可以通过并行化轻松地加快此速度(您可以阅读该here)。

因此,您应该做的是并行处理此foreach循环,并将其与Rufus L的优化代码结合使用,以取得最快的结果。

var rows = rows.Where(r =>
   (r.MinGaitSpeed == null && r.MaxGaitSpeed != null) ||
   (r.MinBergScoreSpeed == null && r.MaxBergScoreSpeed != null) ||
   (r.MinBergScoreSpeed == null && r.MaxBergScoreSpeed != null))

Parallel.ForEach(rows, (row) => {
{
   if (row.MinGaitSpeed == null)
   {
      row.MinGaitSpeed = row.MaxGaitSpeed;
      row.MaxGaitSpeed = null;
   }
   if (row.MinTUGTime == null)
   {
      row.MinTUGTime = row.MaxTUGTime;
      row.MaxTUGTime = null;
   }
   if (row.MinBergScoreSpeed == null)
   {
      row.MinBergScoreSpeed = row.MaxBergScoreSpeed;
      row.MaxBergScoreSpeed = null;
   }
}

请注意,这需要System.Threading.Tasks命名空间,即Parallel类所在的位置。