Как динамически преодолеть цикл foreach для объекта списка - PullRequest
0 голосов
/ 22 мая 2019

При некоторых условиях я меняю свои значения в List Object и обновляю значение List Object.

В настоящее время я занимаюсь - зацикливание на каждом объекте через список - Проверьте, если условие нетто - Поменять значения

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, т. Е. Могу проверить имя свойства, получить значение и т. Д., Но не имея намека на это.

Спасибо

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Поскольку это операция, в которой порядок элементов в списке не имеет значения, вы можете легко ускорить это путем распараллеливания (вы можете прочитать об этом здесь ).

Итак, что вы должны сделать, это обработать этот цикл 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.

0 голосов
/ 22 мая 2019

Это не совсем то, что вы просите, но вы можете объединить предложения в ваших 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;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...