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. vue组件之间的通信

    1.父组件给子组件传递数据 <body> <div id="app"> 父组件:{{total}} <br> <son-component ...

  2. String.Join Method

    Overloads Join(String, String[], Int32, Int32) Concatenates the specified elements of a string array ...

  3. SqlMapConfig.xml 的配置

    jdbc.properties :数据库连接的配置 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://192.168.181.135:33 ...

  4. maven使用中的问题

    1.修改maven的settings.xml后,idea中配置文件指向发生了变化,指向了默认.如果maven配置文件中不是默认的,则需要根据配置文件进行修改.最好在File-Other Setting ...

  5. 洛谷P1072Hankson的趣味题题解

    题目 一道十分经典的数论题,在考场上也可以用暴力的算法来解决,从而得到\(50pts\)的较为可观的分数,而如果想要AC的话,我们观察原题给的数据范围\(a,b,c,d\)(为了好表示,分别代表a1, ...

  6. MongoDB集群管理常用命令

    1.以admin身份登录yqtrack_gather01库: mongo 127.0.0.1:27017/yqtrack_gather01 -u username -p password --auth ...

  7. redis基础知识思维导图

    看到一张redis的基础知识思维导图,比较清晰, 但是没有标明来源,希望知道的给个地址,我也好说明来源 图大小有1M多.在博客上看比较模糊,可以先下载下来查看,或者在浏览器新标签中打开图片查看,就比较 ...

  8. python12--字符串的比较 函数的默认值的细节 三元表达式 函数对象 名称空间 作用域 列表与字典的推导式 四则运算 函数的嵌套

     复习   1.字符串的比较; 2.函数的参数; ******实参与形参的分类: 3.函数的嵌套调用:     # 字符串的比较#  -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 ...

  9. Kubernetes之canal的网络策略(NetworkPolicy)

    安装要求: 1.我们这里安装的是3.3的版本.kubernetes的要求: 支持的版本 1.10 1.11 1.12 2.CNI插件需要启用,Calico安装为CNI插件.必须通过传递--networ ...

  10. [源码分析]StringBuffer

    [源码分析]StringBuffer StringBuffer是继承自AbstractStringBuilder的. 这里附上另外两篇文章的连接: AbstractStringBuilder : ht ...