Liststring str = new Liststring();str.Add( "zs");str.Add("l

时间:2022-05-21 07:55:26

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

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

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

Liststring str = new Liststring();str.Add( "zs");str.Add("l

其实我们简单实现以下就可以实现这个成果

直接上代码如下

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条数据 输出信息后直接删除

Liststring str = new Liststring();str.Add( "zs");str.Add("l

哈哈  是不是很简单呢?固然要实现改削或者其他的成果也是类似的

此外IEnumerator接口中的  public  object Current 为引用类型 所以 如果这里MyItem如果改削为根基类型的话必定会呈现拆箱装箱

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

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