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

简介: C#实现在foreach中删除集合中的元素 1 2 3 4 5 6 7 8 List str = new List(); str.

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

1
2
3
4
5
6
7
8
List< string > str =  new  List< string >();
str.Add(  "zs" );
str.Add( "ls" );
str.Add(  "ws"  );
foreach ( string  in  str)
{
    str.Remove(s);
}

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

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

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

直接上代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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 ;
     }
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

目录
相关文章
|
24天前
|
安全 编译器 程序员
C# 中 foreach 循环和 for 循环深度比较
为什么建议你多数情况下使用 foreach 进行遍历循环?看完你就明白了
|
8天前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
|
2月前
|
存储 C# 索引
C# 一分钟浅谈:数组与集合类的基本操作
【9月更文挑战第1天】本文详细介绍了C#中数组和集合类的基本操作,包括创建、访问、遍历及常见问题的解决方法。数组适用于固定长度的数据存储,而集合类如`List<T>`则提供了动态扩展的能力。文章通过示例代码展示了如何处理索引越界、数组长度不可变及集合容量不足等问题,并提供了解决方案。掌握这些基础知识可使程序更加高效和清晰。
81 2
|
1月前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
|
2月前
|
SQL 开发框架 安全
并发集合与任务并行库:C#中的高效编程实践
在现代软件开发中,多核处理器普及使多线程编程成为提升性能的关键。然而,传统同步模型在高并发下易引发死锁等问题。为此,.NET Framework引入了任务并行库(TPL)和并发集合,简化并发编程并增强代码可维护性。并发集合允许多线程安全访问,如`ConcurrentQueue&lt;T&gt;`和`ConcurrentDictionary&lt;TKey, TValue&gt;`,有效避免数据不一致。TPL则通过`Task`类实现异步操作,提高开发效率。正确使用这些工具可显著提升程序性能,但也需注意任务取消和异常处理等常见问题。
48 1
|
3月前
|
存储 C# 索引
C# 集合语法全解
C# 集合语法全解
30 0
|
3月前
|
前端开发 C# Windows
WPF/C#:如何实现拖拉元素
WPF/C#:如何实现拖拉元素
51 0
|
6月前
|
存储 SQL C#
C# 读取二维数组集合输出到Word预设表格
C# 读取二维数组集合输出到Word预设表格
|
6月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
198 3
|
17天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
30 3