C# switch语句不递增case变量的嵌套foreach循环

C# switch语句不递增case变量的嵌套foreach循环,c#,foreach,switch-statement,increment,C#,Foreach,Switch Statement,Increment,我有以下代码: foreach(List<string> build in Builds) { int i = 0; foreach(string item in build) { switch (i) {

我有以下代码:

                foreach(List<string> build in Builds)
                {
                    int i = 0;
                    foreach(string item in build)
                    {
                        switch (i)
                        {
                            case 0:
                                Console.WriteLine("BuildID: " + item);
                                break;
                            case 1:
                                Console.WriteLine("UserID: " + item);
                                break;
                            case 2:
                                Console.WriteLine("Parameter 1: " + item);
                                break;
                            case 3:
                                Console.WriteLine("Parameter 2: " + item);
                                break;
                            case 4:
                                Console.WriteLine("Parameter 3: " + item);
                                break;
                            case 5:
                                Console.WriteLine("Parameter 4: " + item);
                                break;
                        }
                        i++;
                        Console.WriteLine(i);
                    }
                }
列表中的项目正在递增并正确显示(1,1,a,b,c,d),但由于我不知道的原因,“i”计数器的递增在开关执行后被遗忘了?我不明白?预期产出应为:

BuildID: 1
1
UserID: 1
2
Parameter 1: a
3
Parameter 2: b
4
Parameter 3: c
5
Parameter 4: d
6

我强烈怀疑您有多个列表,但每个列表只有一个条目

您正在外部循环内声明
i
,并将其初始化为0。。。所以你所表现出来的行为正是你在那种情况下所得到的

这很容易进一步诊断。只需添加更多日志:

foreach(List<string> build in Builds)
{
    Console.WriteLine("New build with {0} items", build.Count);
    int i = 0;
假设这是您实际看到的,但不是您期望看到的,那么您需要返回并跟踪创建
构建的位置

另一方面,您的代码要简单得多,因为:

private static readonly string[] BuildItemLabels = 
    { "BuildID", "UserID", "Parameter1", "Parameter2", "Parameter3" , "Parameter4" };
...

foreach (List<string> build in Builds)
{
    for (int i = 0; i < build.Count; i++)
    {
        Console.WriteLine("{0}: {1}", BuildItemLabels[i], build[i]);
    }
}
private静态只读字符串[]BuildItemLabels=
{“BuildID”、“UserID”、“Parameter1”、“Parameter2”、“Parameter3”、“Parameter4”};
...
foreach(列出内置版本)
{
for(int i=0;i

(你应该考虑如果一个列表中有6个以上的项目会发生什么,请注意……)您的输出只执行

BuildId
意思是
foreach(构建中的字符串项)
每个构建中唯一的项是
BuildId
,您的开关将打印该项,然后进入底部,递增i,打印它并返回到外部循环,在那里它被设置为0。这就是为什么它总是1。问题出在循环之外。生成列表实际上没有填充您希望它们包含的数据。

一般来说,这不应该是一个问题

此代码:

        var list1 = new List<int> {10, 20, 30};
        var list2 = new List<int> {1, 2, 3};

        int i = 0;

        foreach (int integ in list1)
        {
            foreach (int integ2 in list2)
            {
                switch (i)
                {
                    case 0:
                        Console.WriteLine(integ + integ2);
                        break;
                    case 1:
                        Console.WriteLine(integ + integ2);
                        break;
                    default:
                        Console.WriteLine(integ + integ2);
                        break;
                }
            }
            i++;
            Console.WriteLine(i);
        }

检查您的数据。这适用于单个项目列表。您的构建是否有多个项目?对不起,我不明白您的意思?列表中的实际数据正在正确运行,但简单的递增变量“i”被遗忘,与列表中的数据无关list@Daniel(真棒的名字)有时候yesLooks像你一样有很多构建,每个构建都只有一个字符串。这很有意义,我将检查“Builds”中实际发送的内容@Dan you如果您仔细查看,我相信您会发现,对于外部循环的每次迭代,您只会检查一次内部循环,这显然不是预期的行为。一旦你确认了你在列表中的位置,那才是真正的问题所在。这是有意义的,我将检查“构建”中实际发送的内容
private static readonly string[] BuildItemLabels = 
    { "BuildID", "UserID", "Parameter1", "Parameter2", "Parameter3" , "Parameter4" };
...

foreach (List<string> build in Builds)
{
    for (int i = 0; i < build.Count; i++)
    {
        Console.WriteLine("{0}: {1}", BuildItemLabels[i], build[i]);
    }
}
        var list1 = new List<int> {10, 20, 30};
        var list2 = new List<int> {1, 2, 3};

        int i = 0;

        foreach (int integ in list1)
        {
            foreach (int integ2 in list2)
            {
                switch (i)
                {
                    case 0:
                        Console.WriteLine(integ + integ2);
                        break;
                    case 1:
                        Console.WriteLine(integ + integ2);
                        break;
                    default:
                        Console.WriteLine(integ + integ2);
                        break;
                }
            }
            i++;
            Console.WriteLine(i);
        }
11
12
13
1
21
22
23
2
31
32
33
3