首页 > 解决方案 > 如何动态克服列表对象的foreach循环

问题描述

我在某些条件下交换列表对象中的值并更新列表对象值。

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

public static void SwapMinMaxIfNull<T>(this IEnumerable<T> rows, string reportfor)
{
   if (reportfor.Equals("Comparison"))
   {
      var row = rows as IEnumerable<RiskBoardDataToExport>;                
      try
      {
         if (rows.Any())
         {
            var Tests = row.Where(min => min.MinGaitSpeed == null && min.MaxGaitSpeed != null).ToList();
            if (Tests != null)
            {
               foreach (RiskBoardDataToExport test in Tests)
               {
                  test.MinGaitSpeed = test.MaxGaitSpeed;
                  test.MaxGaitSpeed = null;
               }
            }
            // again check for next object 
            Tests = row.Where(min => min.MinTUGTime == null && min.MaxTUGTime != null).ToList();
            if (Tests != null)
            {
               foreach (RiskBoardDataToExport test in Tests)
               {
                  test.MinTUGTime = test.MaxTUGTime;
                  test.MaxTUGTime = null;
               }
            }
            // again check for next object
             Tests = row.Where(min => min.MinBergScoreSpeed == null && min.MaxBergScoreSpeed != null).ToList();
             if (Tests != null)
             {
                foreach (RiskBoardDataToExport test in Tests)
                {
                   test.MinBergScoreSpeed = test.MaxBergScoreSpeed;
                   test.MaxBergScoreSpeed = null;
                }
             }
             //.. for brevity
          }
     }
}

我可以以更好的方式做到这一点吗?我知道 PropertyInfo 即可以检查属性名称并获取值等,但是没有任何提示可以完成此操作。

谢谢

标签: c#.netlistobjectdynamic

解决方案


由于这是一个列表中项目的顺序无关紧要的操作,您可以通过并行化轻松加快此操作(您可以在此处阅读)。

因此,您应该做的是以并行方式处理这个 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类所在的位置。


推荐阅读