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;
}
