2

異なるタイプの2つのIEnumberableを考えると、両方のリストを反復処理してすべての可能な組み合わせに対してアクションを実行するためのベストプラクティス(読みやすさと保守性を考慮)は何ですか?

私の最初の解決策は、ネストされたforeachループを使用して、最初のIEnumerableを反復処理し、次にそのループ内で2番目のIEnumerableを反復処理し、外部ループと現在のループからターゲットメソッドに値を渡すことでした。例えば。:

enum ParamOne
{
    First, 
    Second,
    Etc
}

List<int> paramTwo = new List<int>() { 1, 2, 3 };

void LoopExample()
{
    foreach (ParamOne alpha in Enum.GetValues(typeof(ParamOne)))
    {
        foreach (int beta in paramTwo)
        {
            DoSomething(alpha, beta);
        }
    }
 }

LINQを使用して再構築しようとしましたが、明らかな利点がなく、直感的ではないように思われるものになりました。ここで検索すると、子プロパティを反復処理するためのforeachのネストに関する多くの質問が表示されますが、2つの異なるリストを反復処理することについては何も見つかりませんでした。

4

2 に答える 2

1

私はあなたの解決策に特に悪いことは何も見ていません。そうは言っても、最も単純なLINQ手順は次のようになります。

foreach(var entry in enumerable1.SelectMany(
            e => enumerable2.Select(e2 => new { First = e, Second = e2 })))
{
    DoSomething(entry.First, entry.Second);
}

それが少し...鈍い...私は2つのforeach操作に固執することをお勧めします。これは、C#コンパイラがその式を機能させるために実行するすべてのシェナニガンよりも安価です(クロージャと匿名型の両方を扱っているため)。

于 2010-04-20T21:13:18.010 に答える
1

組み合わせに重複がない限り、2 つのセットのデカルト積の関数を計算するより効率的な方法はないと思います。ただし、いずれかのリストに重複する要素がある場合、または DoSomething への引数の順序が重要ではなく、リスト内で重複がある場合は、DoSomething への冗長な呼び出しが生成されます。DoSomething をメモ化することで、計算時間を節約できます。

于 2010-04-20T21:20:18.480 に答える