foreach是取只读的,在取的时候数据不能变(包括修改,删除,添加等)。要避免这个问题,就应该使用for循环。
以前没有考虑过对collection类型对象操作时for 和foreach的区别,总感觉foreach更方便一些。今天写了个foreach循环来遍历一个list,之后在foreach体内又对其添加,表面上逻辑和写法看着没错,但在运行时出现异常:查询集合已修改;可能无法执行枚举操作。查了一下,这个是使用foreach的典型的问题。
附错误demo代码:
try
{
List<
string
> lsts =
new
List<
string
>();
lsts.Add(
"1"
);
lsts.Add(
"2"
);
lsts.Add(
"3"
);
lsts.Add(
"4"
);
lsts.Add(
"2"
);
lsts.Add(
"6"
);
lsts.Add(
"1"
);
lsts.Add(
"8"
);
lsts.Add(
"9"
);
lsts.Add(
"10"
);
int
count = 0;
int
countreus = 0;
List<
string
> lstresult =
new
List<
string
>();
foreach
(
string
a
in
lsts)
{
count++;
if
(count == 1)
{
lstresult.Add(a);
}
else
{
if
(count == lsts.Count)
{
count = 0;
}
else
{
foreach
(
string
b
in
lstresult)
{
countreus++;
if
(b.Contains(a.Trim()))
{
break
;
}
else
{
if
(countreus == lstresult.Count)
{
lstresult.Add(a);
}
}
}
}
}
}
}
catch
(Exception ex)
{
throw
;
}
|
最后抛出异常:集合已修改;可能无法执行枚举操作。
正确代码如下:
try
{
List<
string
> lsts =
new
List<
string
>();
lsts.Add(
"1"
);
lsts.Add(
"2"
);
lsts.Add(
"3"
);
lsts.Add(
"4"
);
lsts.Add(
"2"
);
lsts.Add(
"6"
);
lsts.Add(
"1"
);
lsts.Add(
"8"
);
lsts.Add(
"9"
);
lsts.Add(
"10"
);
int
count = 0;
int
countreus = 0;
List<
string
> lstresult =
new
List<
string
>();
foreach
(
string
a
in
lsts)
{
count++;
if
(count == 1)
{
lstresult.Add(a);
}
else
{
if
(count == lsts.Count)
{
count = 0;
}
else
{
for
(
int
i = 0; i < lstresult.Count; i++)
{
countreus++;
if
(lstresult[i].Contains(a.Trim()))
{
break
;
}
else
{
if
(countreus == lstresult.Count)
{
lstresult.Add(a);
}
}
}
}
}
}
}
catch
(Exception ex)
{
throw
;
}
|