C#实现在foreach中删除集合中的元素

List<string> str = new List<string>();
str.Add( "zs");
str.Add("ls");
str.Add( "ws" );
foreach(string s in str)
{
   str.Remove(s);
}

有时候我们在foreach中需要修改或者删除集合

可是这时候却报如下错误:集合已修改;可能无法执行枚举操作。

其实我们简单实现以下就可以实现这个功能

直接上代码如下

    public class MyClass<T>
    {
        MyClassCollection<T> collection = new MyClassCollection<T>();
        public IEnumerator GetEnumerator()
        {
            return collection;
        }
        public void Remove(T t)
        {
            collection.Remove(t);
        }

        public void Add(T t)
        {
            collection.Add(t);
        }
    }

    public class MyClassCollection<T> : IEnumerator
    {
        List<T> list = new List<T>();
        public object current = null;
        Random rd = new Random();
        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);
            }
        }
    }

    public class MyItem
    {
        public string id
        {
            get;
            set;
        }

        public int sex
        {
            get;
            set;
        }
        public string name
        {
            get;
            set;
        }

        public int age
        {
            get;
            set;
        }
    }

  然后我们直接调用一下试验下:

            MyClass<MyItem> myclass = new MyClass<MyItem>();
            //添加10条数据
            Random rd = new Random();
            for (int i = 0; i < 10; i++)
            {
                MyItem item = new MyItem();
                item.age = rd.Next(1, 80);
                item.id = rd.Next().ToString();
                item.name = "name" + rd.Next().ToString();
                item.sex = rd.Next(0, 1);
                myclass.Add(item);
            }

            foreach (MyItem item in myclass)
            {
                Console.WriteLine(item.name);
                myclass.Remove(item);
            }

            Console.Read();

  这段代码就是模拟10条数据 输出信息后直接删除

哈哈  是不是很简单呢?当然要实现修改或者其他的功能也是类似的

另外IEnumerator接口中的  public  object Current 为引用类型 所以 如果这里MyItem如果修改为基本类型的话肯定会出现拆箱装箱

如果 如果foreach中是基本类型的话就不要用foreach了 如果需要考虑性能的话。

 源代码下载:https://files.cnblogs.com/files/devgis/TestIEnumerator.rar

posted @ 2017-11-17 17:15  devgis  阅读(8409)  评论(0编辑  收藏  举报