C# 为什么我的for循环没有创建所有可能的组合?

C# 为什么我的for循环没有创建所有可能的组合?,c#,C#,我正试着做一个“开锁器”,这样我就可以在简历上写些东西,这样我就可以在明年夏天得到实习机会 锁中的每个“轮子”包含5个字母,这些字母存储在列表中。我有5个轮子,我正试图从5个轮子中得到所有可能的组合。实际上,组合锁每个“轮子”有10个字母,但我正在努力使迭代正常工作。然而,我的代码似乎只在每次迭代中打印相同的值 我的代码: totalList.Add(""); for (int i = 0; i < one.Count; i++) { int a = i; int b =

我正试着做一个“开锁器”,这样我就可以在简历上写些东西,这样我就可以在明年夏天得到实习机会

锁中的每个“轮子”包含5个字母,这些字母存储在列表中。我有5个轮子,我正试图从5个轮子中得到所有可能的组合。实际上,组合锁每个“轮子”有10个字母,但我正在努力使迭代正常工作。然而,我的代码似乎只在每次迭代中打印相同的值

我的代码:

totalList.Add("");
for (int i = 0; i < one.Count; i++)
{

    int a = i;
    int b = 0;
    int c = 0;
    int d = 0;
    int e = 0;

    for (int ii = 0; ii < two.Count; ii++)
    {
        b = ii;
        for (int iii = 0; iii < three.Count; iii++)
        {
            c = iii;
            for (int iv = 0; iv < four.Count; iv++)
            {
                d = iv;
                for (int v = 0; v < five.Count; v++)
                {
                    e = v;
                    string myString = "" + one[a] + two[b] + three[c] + four[d] + five[e];
                    totalList.Add(myString);
                }
            }
        }
    }
}
totalist.Add(“”);
for(int i=0;i<1.Count;i++)
{
int a=i;
int b=0;
int c=0;
int d=0;
int e=0;
对于(int ii=0;ii<2.Count;ii++)
{
b=ii;
对于(int iii=0;iii<3.Count;iii++)
{
c=iii;
for(intiv=0;iv<4.Count;iv++)
{
d=iv;
for(int v=0;v<5.Count;v++)
{
e=v;
字符串myString=“”+1[a]+2[b]+3[c]+4[d]+5[e];
totalist.Add(myString);
}
}
}
}
}

仅供参考——这里有一个编写代码的简单方法,包括初始化。for循环很好,我实际上建议使用大括号(
{}
),但是a、b、c、d、e变量是完全多余的(可以使用循环计数器)。同样的事情也适用于列表。 总之…较短的版本:

        char[] w1 = { 'a', 'b', 'c', 'd', 'e' };
        char[] w2 = { 'f', 'g', 'h', 'i', 'j' };
        char[] w3 = { 'k', 'l', 'm', 'n', 'o' };
        char[] w4 = { 'p', 'q', 'r', 's', 't' };
        char[] w5 = { 'u', 'v', 'w', 'x', 'y' };
        List<string> totalString = new List<string>();
        foreach (var c1 in w1)
            foreach (var c2 in w2)
                foreach (var c3 in w3)
                    foreach (var c4 in w4)
                        foreach (var c5 in w5)
                            totalString.Add( "" + c1 + c2 + c3 + c4 + c5);
char[]w1={'a','b','c','d','e'};
char[]w2={'f','g','h','i','j'};
char[]w3={'k','l','m','n','o'};
char[]w4={'p','q','r','s','t'};
char[]w5={'u','v','w','x','y'};
List totalString=新列表();
foreach(w1中的变量c1)
foreach(w2中的变量c2)
foreach(w3中的变量c3)
foreach(w4中的变量c4)
foreach(w5中的变量c5)
totalString.Add(“+c1+c2+c3+c4+c5”);

通过考虑问题的性质,您可以通过单个循环处理此问题。通过所有可能的轮子组合进行步进就像计数一样,只在基数5(在本例中)。您可以使用二进制进行计数,然后将每个数字转换为基数5,以转换为车轮位置集

注意:如果控制盘的位数不同,可以更改为使用控制盘大小数组来提取每个数字

var allWheels = new List<char[]> { w1, w2, w3, w4, w5 };
var totalNumCombos = allWheels.Select(w => w.Length).Aggregate(1, (a, n) => a * n);

var numWheels = allWheels.Count;
var numWheelsm1 = numWheels-1;
var wheelbase = w1.Length; // use an array for different sized wheels
                           // allWheels.Select(w => w.Length).ToArray();
var allCombos = new List<string>();

var sbCombo = new StringBuilder(new String(allWheels.ToArray().Reverse().Select(w => w[0]).ToArray()));

for (int aComboInDecimal = 0; aComboInDecimal < totalNumCombos; ++aComboInDecimal) {
    var num = aComboInDecimal;
    for (var digit = 0; digit < numWheels && num > 0; ++digit) {
        var digitVal = num % wheelbase; // wheelbase[digit]
        num = num / wheelbase; // wheelbase[digit]
        sbCombo[numWheelsm1-digit] = allWheels[digit][digitVal];
    }
    allCombos.Add(sbCombo.ToString());
}
var allWheels=新列表{w1,w2,w3,w4,w5};
var totalNumCombos=allWheels.Select(w=>w.Length.Aggregate(1,(a,n)=>a*n);
var numWheels=allWheels.Count;
var numWheelsm1=numWheels-1;
var轴距=w1.长度;//对不同大小的控制盘使用阵列
//选择(w=>w.Length).ToArray();
var allCombos=新列表();
var sbCombo=newstringbuilder(新字符串(allWheels.ToArray().Reverse().Select(w=>w[0]).ToArray());
对于(int aComboInDecimal=0;aComboInDecimal0;++数字){
var digitVal=num%轴距;//轴距[位数]
num=num/轴距;//轴距[位数]
sbCombo[numheelsm1 digit]=所有车轮[digit][digitVal];
}
添加(sbCombo.ToString());
}

这似乎不是全部代码您的代码缩进方式非常混乱。对不起。在编程方面,我真的不需要和任何人一起工作,所以我想我有点马虎了。@sweaver2112差不多了。这是在一个函数中,“一”和“二”等是字符数组。fwiw做10级循环可能不会给很多面试官留下深刻印象。5岁时,你必须开始思考有更好的方法。。。对吗?当您需要正确的重载
+
时,
+
什么时候有用。(我这样做是为了与OP保持一致,尽管我没有特别的问题。)啊,所以你的
s1
等应该是
c1
,等等:)我想我更喜欢
c1.ToString()+c2+
…编辑。谢谢。这与原始代码完全相同(尽管效率更高)。这能解决什么问题?@Jinette-你也应该投票选出有帮助的答案(当然是你接受的答案)