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

C#实现在foreach中删除集合中的元素的更多相关文章

  1. C#实现在foreach遍历中删除集合中的元素(方法总结)

    目录 方法一:采用for循环,并且从尾到头遍历 方法二:使用递归 方法三:通过泛型类实现IEnumerator 在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致 ...

  2. C#中删除集合中符合条件的元素以及需注意属相

    如果用foreach,会造成被遍历的集合更改后带来异常问题. 此时,用for循环可有效的解决这个问题. for(int i=0;i<List.Count;i++) { if(条件是真) { Li ...

  3. Day_11【集合】扩展案例2_使用普通for循环获取集合中索引为3的元素并打印,统计集合中包含字符串"def"的数量,删除集合中的所有字符串",将集合中每个元素中的小写字母变成大写字母def",

    分析以下需求,并用代码实现 1.定义ArrayList集合,存入多个字符串"abc" "def" "efg" "def" ...

  4. 【转载】C#中List集合中Last和LastOrDefault方法的差别

    在C#的List集合操作中,Last方法和LastOrDefault方法都会用来查找集合中最后一个符合条件的元素对象,但Last和LastOrDefault方法还是有差别的,建议使用LastOrDef ...

  5. detach([expr]) 从DOM中删除所有匹配的元素。

    detach([expr]) 概述 从DOM中删除所有匹配的元素.大理石构件 这个方法不会把匹配的元素从jQuery对象中删除,因而可以在将来再使用这些匹配的元素.与remove()不同的是,所有绑定 ...

  6. Java循环删除集合多个元素的正确打开方式

    首先说下不正确的打开方式: 第一:使用for循环删除集合的元素,示例代码如下 ArrayList<String> list = new ArrayList<String>(Ar ...

  7. sql server 中删除表中数据truncate和delete的区别(转载自.net学习网)

    我们都知道truncate table可以用来删除整个表的内容,它与delete后面不跟where条件的效果是一样.但除此之外,我们还清楚它们之间有其它的区别吗?本章我们将一起讨论truncate与d ...

  8. JS中删除字符串中的空格

    问题描述:         在进行字符串操作时,由于字符串中存在较多的空格,因此需要考虑取消字符串中的空格 问题解决:       (1)删除字符串中的前导空格(字符串的前面的空格): 注意:这里使用 ...

  9. java中TreeSet集合如何实现元素的判重

    /* 看一下部分的TreeSet源码.... public class TreeSet<E> extends AbstractSet<E> implements Navigab ...

随机推荐

  1. AppiumDesktop录制脚本

    AppiumDesktop启动页面: 启动AppiumDesktop以后点击该页面右上角的Start New Session按钮,就会启动一个新的会话窗口(如下图),在这个窗口我们需要配置一些Desi ...

  2. 安装vue-cli

    1.路径 https://nodejs.org/en/ cmd 创建项目 1.创建一个基于 webpack 模板的新项目 vue init webpack projectname(项目名) 2.项目名 ...

  3. 三、Redis基础操作

    前言: Redi是key-value的NoSQL,我们用Redis提供的redis-cli就能操作String类型key和各种数据类型value.但是放入的不是特定类型数据,添加的都是一个一个Stri ...

  4. CentOS_7下安装MySQL

    卸载旧版本MySQl: 下载MySQ: MySQl官网:https://dev.mysql.com/downloads/mysql/ 版本自选,操作系统选Linux-Generic,64位系统或者32 ...

  5. 微信小程序字体设置

    微信小程序css篇----字体(Font) 一.字体:font.属性在一个声明中设置所有字体属性. 可设置的属性是(按顺序): "font-style font-variant font-w ...

  6. 制作OSGB数据索引

    [干货]教你用.S3C文件制作OSGB数据索引 [干货]教你用.S3C文件制作OSGB数据索引_搜狐汽车_搜狐网 S3C是ContextCapture(原Smart 3D)的一种数据格式,.S3C格式 ...

  7. P1162 填涂颜色

    原题链接 https://www.luogu.org/problemnew/show/P1162 一道很水很简单的搜索题,好吧我还是交了4次才过的...... 说一下简单的思路: 首先输入n*n的矩阵 ...

  8. jQuery与原生JS相互转化

    前端发展很快,现代浏览器原生 API 已经足够好用.我们并不需要为了操作 DOM.Event 等再学习一下 jQuery 的 API.同时由于 React.Angular.Vue 等框架的流行,直接操 ...

  9. BZOJ2127Happiness

    题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...

  10. centos7使用kubeadm安装部署kubernetes 1.14

    应用背景: 截止目前为止,高热度的kubernetes版本已经发布至1.14,在此记录一下安装部署步骤和过程中的问题排查. 部署k8s一般两种方式:kubeadm(官方称目前已经GA,可以在生产环境使 ...