簡體   English   中英

如何動態地克服列表對象的foreach循環

[英]How to overcome foreach loop for list object dynamically

我在某些條件下交換List對象中的值並更新List Object值。

目前,我正在做的是 - 通過List循環每個對象 - 檢查條件是否為net - 交換值

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即可以檢查屬性名稱和獲取值等,但是,沒有任何提示來完成這項工作。

謝謝

這不完全是你所要求的,但你可以在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;
            }
        }
    }
}

由於這是一個列表中項目順序無關緊要的操作,您可以通過並行化輕松加快速度(您可以在此處閱讀)。

所以,你應該做的是,以並行的方式處理這個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類的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM