2017-01-17 5 views
1

У меня есть пара проблем с моим кодом ниже.C# Code Optimization GroupBy

var groupedItems = inputFiles.GroupBy(q => q.Name.ToLower().Split('_').ElementAt(2)); 
     string currentNo = ////value retreived from someMethod; 
     if (string.IsNullOrEmpty(currentNo)) 
     { 
      if (groupedItems.Count() > 1) 
      { 
       foreach (var group in groupedItems) 
       { 
        foreach (var groupedItem in group) 
        { 
         ErrorFile(groupedItem); 
        } 
       } 
      } 
      else if (groupedItems.Count() == 1) 
      { 
       ProcessFile(); 
      } 
     } 
     else 
     { 
      foreach (var group in groupedItems.Where(x => x.Key != currentNo)) 
      { 
       foreach (var groupedItem in group) 
       { 
        ErrorFile(groupedItem); 
       } 
      } 
     } 
  • Существует повторяющийся код вложенных циклов Foreach. Я смотрю на возможность оптимизации
  • Как обращаться с ошибками возврата Split и ElementAt (2). Мне еще нужно вызвать метод ErrorFile(), даже если я не могу разделить на _.

ответ

0

Трудно понять, что ваш код действительно делает без больше контекста, но это должно быть о праве:

static void SomeMethod(IEnumerable<File> inputFiles) 
{ 
    var groupedItems = inputFiles.GroupBy 
     (f => splitAndFindElement(f.Name, '_', 2, string.Empty)); 

    string currentNo = //whatever; 

    if (string.IsNullOrEmpty(currentNo)) 
    { 
     if (groupedItems.Count() > 1) 
     { 
      foreach (var item in groupedItems.SelectMany(g => g)) 
      { 
       ErrorFile(item); 
      } 
     } 
     else if (groupedItems.Count() == 1) 
     { 
      ProcessFile(); 
     } 
    } 
    else 
    { 
     foreach (var item in groupedItems.Where(g => g.Key != currentNo).SelectMany(g => g)) 
     { 
      ErrorFile(item); 
     } 
    } 
} 

И вспомогательный метод:

static string splitAndFindElement(string input, char splitter, int index, string resultOnFail) 
{ 
    var succesful = false; 
    string[] words = null; 

    if (input != null) 
    { 
     words = input.Split(splitter); 
     succesful = words.Length > index; 
    } 

    return succesful ? words[index] : resultOnFail; 
} 

Хитрость здесь заключается в групповые файлы с ключом "", если они не могут быть разделены. Это гарантирует, что они будут обработаны с помощью ErrorFile либо потому, что существует более одной группировки, либо потому, что ключ не равен currentNo. Я предполагаю, что Name не может закончиться в "_".

Кроме того, SelectMany используется для выравнивания перечислимых величин и предотвращения вложенных циклов.

0

Мы можем оптимизировать повторяющиеся циклы следующим образом, и для обработки ошибок использование попытки поймать

var groupedItems; 
try 
{ 
    groupedItems= inputFiles.GroupBy(q => q.Name.ToLower().Split('_').ElementAt(2)); 

    string currentNo = ////value retreived from someMethod; 
    if (string.IsNullOrEmpty(currentNo) && groupedItems.Count() == 1) 
    { 
     ProcessFile(); 
    } 
    else 
    { 
     foreach (var group in groupedItems.Where(x => string.IsNullOrEmpty(currentNo) || x.Key != currentNo)) 
     { 
      foreach (var groupedItem in group) 
      { 
       ErrorFile(groupedItem); 
      } 
     } 
    } 
} 
catch 
{ 
    ErrorFile(groupedItem); 
}