今天无意间遇到这样一个问题,请各位大牛帮忙解答一下:
1 List<string> list = new List<string> { "A", "B", "C" }; 2 List<string> list1 = new List<string> { "A1", "B1", "C1", "A2", "B2", "C2" }; 3 List<string> list2 = new List<string> { "A11", "B11", "C11", "A12", "B12", "C12", "A21", "B21", "C21", "A22", "B22", "C22" }; 4 var fl = new List<string>(); 5 6 //第一次 7 foreach (var o in list) 8 { 9 //第二次 10 fl = list1.FindAll(d => d.Contains(o)); 11 foreach (var one in fl) 12 { 13 //第三次 14 fl = list2.FindAll(d => d.Contains(one)); 15 foreach (var two in fl) 16 { 17 Console.Write(two+" "); 18 } 19 Console.WriteLine("\n"); 20 } 21 }
在B循环中,第一次为fl赋值是A1和A2,one的值是A1时,C循环中的fl值应该是A11和A12,
C循环走完后,回到B循环中,one的值是A2,而fl的值仍是A11和A12,
fl是一个变量,在B时给赋了值,到C中再次给赋值,为什么回到B循环时,one仍是原来的值,而不是在C中改变后的值?
同一个变量,在多次循环中多次赋值后,每个循环都能记住在本次循环中的值,这是什么原理?
初次看也感觉不好解释,毕竟循环中修改循环主体貌似都有点不合情理,不过编译器对上面那段代码的优化,貌似还是可以解释的。不过也就值类型这样,引用应该会有问题,这个可以自己尝试下。
因为每个foreach里面的变量都不一样。我举个栗子:下面图中,flag的值虽然在子循环里被赋值过,但是回到父循环时,由于父循环的item始终是父循环的item的原因,flag下次使用的值仍是父循环的下个值,这个时候已经和子循环没关系了。所以其实子循环虽然可以修改flag的值,但是父循环的item不变,flag的值也会按照父循环的来。道理和你上面的一样
谢谢,但还是有点不太明白,你这里的flag在每次赋值之后,只使用一次就会重新赋值,但我上面的代码中,fl在第二次循环中赋值后,还要对fl遍历,而对fl遍历时又会给它重新赋值,这和你给举出的例子还是不同的
不懂你为什么要这么做,不同的循环用同一个变量
fl = list1.FindAll(d => d.Contains(o)); 和 fl = list2.FindAll(d => d.Contains(one));
建议给代码加上高亮
– dudu 6年前@dudu: 谢谢,已修改
– 韩杞柳 6年前