6

私の問題は次のようなものです:

並べ替えが必要なリストがいくつかありますが、リスト番号がわかりません。また、すべてのリストのすべての要素番号も認識できません。1) リスト 1 から A を、リスト 2 から A を、リスト 3 から A を選択します。2) リスト 1 から A を、リスト 2 から A を、リスト 3 から B を、すべて順列の場合に ick します。

2 つのリストがある場合のように、ネストされた for ループを使用してトラバースします。

        for (int i = 0; i < list[0].EnergyParameters.ListEnergyLevelCandidates.Count; i++)
        {
            for (int j = 0; j < list[1].EnergyParameters.ListEnergyLevelCandidates.Count; j++)
            {
                // Do sth
            }
        }

リストが 3 つある場合は、次のようになります。

        for (int i = 0; i < list[0].EnergyParameters.ListEnergyLevelCandidates.Count; i++)
        {
            for (int j = 0; j < list[1].EnergyParameters.ListEnergyLevelCandidates.Count; j++)
            {
                for (int k = 0; k < list[2].EnergyParameters.ListEnergyLevelCandidates.Count; k++)
                {
                    // Do sth
                }
            }
        }

リスト番号がわからないため、ネスト番号もわかりません。つまり、for ループを何レベル書く必要があるかわかりません。

このような状況では、動的 for ループ レベルのコードをどのように記述すればよいでしょうか。10 個のリストに対して 10 個のループを書きたくありません。

4

1 に答える 1

12

リストがいくつあるかわからない場合は、ネストされたループを記述せず、代わりに再帰を記述します。呼び出しの各レベルで、次のように1つのリストをループします。

void AllCombos(List<string>[] lists, int level, string[] current) {
    if (level == lists.Length) {
        // Do somthing; items of current[] contain elements of the combination
    } else {
        foreach (var s in lists[level]) {
            current[level] = s;
             AllCombos(lists, level+1, current);
        }
    }
}

次のように呼び出しAllCombosます。

var lists = new List<string>[10];
for (int i = 0 ; i != 10 ; i++) {
    lists[i] = PopulateMyList(i);
}
string[] current = new string[lists.Length];
AllCombos(lists, 0, current);
于 2012-05-21T22:26:35.887 に答える