首页 新闻 会员 周边 捐助

C#循环中的变量赋值

0
[已解决问题] 解决于 2018-06-13 14:52

今天无意间遇到这样一个问题,请各位大牛帮忙解答一下:

 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中改变后的值?

同一个变量,在多次循环中多次赋值后,每个循环都能记住在本次循环中的值,这是什么原理?

C#
韩杞柳的主页 韩杞柳 | 菜鸟二级 | 园豆:204
提问于:2018-02-23 17:20

建议给代码加上高亮

dudu 6年前

@dudu: 谢谢,已修改

韩杞柳 6年前
< >
分享
最佳答案
0

初次看也感觉不好解释,毕竟循环中修改循环主体貌似都有点不合情理,不过编译器对上面那段代码的优化,貌似还是可以解释的。不过也就值类型这样,引用应该会有问题,这个可以自己尝试下。

奖励园豆:5
who? | 菜鸟二级 |园豆:209 | 2018-02-28 09:09
其他回答(2)
1

因为每个foreach里面的变量都不一样。我举个栗子:下面图中,flag的值虽然在子循环里被赋值过,但是回到父循环时,由于父循环的item始终是父循环的item的原因,flag下次使用的值仍是父循环的下个值,这个时候已经和子循环没关系了。所以其实子循环虽然可以修改flag的值,但是父循环的item不变,flag的值也会按照父循环的来。道理和你上面的一样

 

顾星河 | 园豆:7281 (大侠五级) | 2018-02-24 09:10

谢谢,但还是有点不太明白,你这里的flag在每次赋值之后,只使用一次就会重新赋值,但我上面的代码中,fl在第二次循环中赋值后,还要对fl遍历,而对fl遍历时又会给它重新赋值,这和你给举出的例子还是不同的

支持(0) 反对(0) 韩杞柳 | 园豆:204 (菜鸟二级) | 2018-02-26 09:01
0

 不懂你为什么要这么做,不同的循环用同一个变量

jqw2009 | 园豆:2341 (老鸟四级) | 2018-02-27 09:04

fl = list1.FindAll(d => d.Contains(o));  和   fl = list2.FindAll(d => d.Contains(one));

支持(0) 反对(0) 韩杞柳 | 园豆:204 (菜鸟二级) | 2018-02-27 09:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册