在搜索该问题之前我想你一定已经用过foreach遍历并Remove的操作,突然发现报出了
集合已修改;可能无法执行枚举操作的异常。
我这里给大家提供四种方式遍历删除数据:
第一种是模仿阿里巴巴Java开发手册1.4的删除(迭代器):
新贴出手册中的内容:
发现C#里并没有hasNext()的方法就自己实现了一下
class MyList<T> : IEnumerator
{
List<T> list = new List<T>();
public object current = null;
public object Current
{
get { return current; }
}
int icout = 0;
public bool MoveNext()
{
if (icout >= list.Count)
{
return false;
}
else
{
current = list[icout];
icout++;
return true;
}
}
public void Reset()
{
icout = 0;
}
public void Add(T t)
{
list.Add(t);
}
public void Remove(T t)
{
if (list.Contains(t))
{
if (list.IndexOf(t) <= icout)
{
icout--;
}
list.Remove(t);
}
}
}
测试代码:
第二种:
//通过移动下标来确保不会漏掉要删除的数据
private static void DeleteList(List<int> testList)
{
for (int i = 0; i < testList.Count; i++)
{
if (testList[i].Equals(0) || testList[i].Equals(1) || testList[i].Equals(2) || testList[i].Equals(3))
{
Console.WriteLine("删除元素:" + testList[i]);
testList.Remove(testList[i]);
i--;
}
}
}
第三种:
//通过倒序遍历List以保证下标位置
private static void RemoveList(List<int> testList)
{
for (int i = testList.Count - 1; i >= 0; i--)
{
if (testList[i].Equals(0) || testList[i].Equals(1) || testList[i].Equals(2) || testList[i].Equals(3))
{
Console.WriteLine("删除元素:" + testList[i]);
testList.Remove(testList[i]);
}
}
}
第四种:
//通过生成新List来达成删除的需求
private static List<int> WhereList(List<int> testList)
{
List<int> needDelete = new List<int>() { 0, 1, 2, 3 };
return testList.Where(p => !needDelete.Contains(p)).ToList();
}
四种方式中无特殊要求第四种最简单,其次第二第三,第一种方式可方便自己添加功能但也是最麻烦的。
记录生活点点滴滴。