2017-01-17 17 views
1

私は以下のコードにいくつか問題があります。C#コード最適化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; 
} 

ここにトリックがにありますグループファイルを分割することができない場合は""キーを使用します。これにより、2つ以上のグループがあるか、またはキーがcurrentNoに等しくないため、ErrorFileで処理されます。私はここで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); 
} 
エラー使用トライキャッチを処理するために、