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

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

时间: 2024-08-02 13:16:37

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

ArrayList删除集合中某一属性相同的元素方法(推荐)_java

如果想要集合中的元素不会有重复,那么推荐使用hashSet,如下: // list是有重复元素的ArrayList HashSet hSet = new HashSet(list); list.clear(); list.addAll(hSet); 但是有时我们想删除某一个重复属性值(值相同)的某个元素,如下: NetWork nw1 = new NetWork(); nw1.id = 1; nw1.destip = "192.168.1.3"; NetWork nw2 = new N

fragment 中 删除listview中的一行,执行更新数据,数据已经删除了,界面更新不了。

问题描述 fragment 中 删除listview中的一行,执行更新数据,数据已经删除了,界面更新不了. fragment 中 删除listview中的一行,执行更新数据,数据已经删除了,界面更新不了.退出程序,重新加载fragment界面可以显示删除后的界面请问改怎么刷新 fragment .网上说的adapter.notifyDataSetChanged();不行.新手求解答,谢谢大神!!! 解决方案 你要把listview对应的数据集中的记录也删除,然后adapter再 notify一下

nsstring-OC中删除字符串中相邻的重复字符

问题描述 OC中删除字符串中相邻的重复字符 //去除字符串内的相邻的重复字符,例如:aabdaaadesff,最后结果abdadesf NSMutableString *string = [NSMutableString stringWithFormat:@"aabbssddffiieeoo"]; NSString *strIndex1 = @""; NSString *strIndex2 = @""; for (NSInteger i = 0;

java 中list集合中对象的声明周期

问题描述 java 中list集合中对象的声明周期 list集合中存放是是堆中的对象,但如果堆中的对象被回收后就变成了空?还是只要list集合存在就不会被回收?如果会被回收的话,怎样保证集合内的数据在list存在时长期有效??求大牛帮助

java中删除 数组中的指定元素

java的api中,并没有提供删除数组中元素的方法.虽然数组是一个对象,不过并没有提供add().remove()或查找元素的方法.这就是为什么类似ArrayList和HashSet受欢迎的原因.不过,我们要感谢Apache Commons Utils,我们可以使用这个库的ArrayUtils类来轻易的删除数组中的元素.不过有一点需要注意,数组是在大小是固定的,这意味这我们删除元素后,并不会减少数组的大小.所以,我们只能创建一个新的数组,然后使用System.arrayCopy()方法将剩下的元

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

/* 看一下部分的TreeSet源码.... public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable { private transient NavigableMap<E,Object> m; //NavigableMap继承SortedMap, 二者都是接口,在TreeMap中有实现 private

Java中删除数组中重复元素

这个是一个老问题,但是发现大多数人说的还不够透.小弟就在这里抛砖引玉了,欢迎拍砖....... 问题:比如我有一个数组(元素个数为0哈),希望添加进去元素不能重复. 拿到这样一个问题,我可能会快速的写下代码,这里数组用ArrayList. private static void testListSet(){           List<String> arrays = new ArrayList<String>(){               @Override        

java中删除数组中重复元素方法探讨_java

问题:比如我有一个数组(元素个数为0哈),希望添加进去元素不能重复. 拿到这样一个问题,我可能会快速的写下代码,这里数组用ArrayList. 复制代码 代码如下: private static void testListSet(){        List<String> arrays = new ArrayList<String>(){            @Override            public boolean add(String e) {         

在xp系统中删除vista中不需要的组件

我们已经知道,默认安装Vista的容量就需要7GB~8GB的空间,对于硬盘空间紧张的用户,我们可以手动在Windows XP删除Vista不必要的组件 .由于在Windows XP中要删除的组件并不在使用中,我们可以轻松删除它们. 删除文件前建议先对系统进行备份,进入Vista运行无异常后再彻底删除备份.比如,可以删除d:Windows/Web/Wall/paper(自带墙纸,不需要的可以删除,占用45.5MB).d:Windows/System32/Driver/StoreFile/Repos