3

ネストされた「foreach」の数に関するベストプラクティスはありますか?

つまり、複雑な辞書でネストされた「foreach」に渦巻いています。「可能性がある」オーバーヘッドが発生し始めてパフォーマンスが低下するポイントはありますか? これは検討に値するものでしょうか。

具体的で、主観的であることを許容しないようにするために、次のような 3 つの複雑な辞書があります。

Dictionary<int, Dictionary<string, XObject>()
Dictionary<string, List<YObject>()
Dictionary<string, Dictionary<string, List<ZObjects>()

明らかに、これらのディクショナリを (foreach で) フィルタリングして、探しているデータを生成すると、コードの構造は、外側の 1 を除く 5 つのネストされた「foreach」に向かっています。影響を受けるのではないかと心配しています:

  1. パフォーマンス(コンテキスト スイッチが多すぎる)
  2. メモリ(特定の瞬間にすべてのデータセットをメモリに保持する)
  3. 保守性(悪いプログラマー!)

ベストプラクティスか、それとも問題ではないか?

4

2 に答える 2

4
  1. foreach ステートメントには「コンテキスト スイッチ」はありません。
  2. メモリ: まったく関係ありません。メモリは、列挙子ではなくデータによって使用されます (foreach ステートメントによって使用されます)。
  3. 保守性: コードをリファクタリングして、項目を実行するメソッドを追加することを検討してください
于 2013-04-16T12:18:12.147 に答える
3

これを達成する明確で簡潔な方法は、それらを機能的に分離することです。検討:

// represents outer loop
IEnumerable<KeyValuePair<string, string>> Operation1(IEnumerable<KeyValuePair<string, string>> input)
{
   // outer loop processing
   IEnumerable<KeyValuePair<string, string>> output = Operation2(input);
   return output;
}

// which feeds in to...

IEnumerable<KeyValuePair<string, string>> Operation2(IEnumerable<KeyValuePair<string, string>> input)
{
    // work on it
   IEnumerable<KeyValuePair<string, string>> output = Operation3(input);
   return output;
}

// and finally

IEnumerable<KeyValuePair<string, string>> Operation3(IEnumerable<KeyValuePair<string, string>> input)
{
    // work on it
    return input;
}

これにより、ループの機能が分離され、順序を変更でき、それぞれが個別の作業単位になります。

于 2013-04-16T12:19:00.613 に答える