list里面删除元素的算法问题

lijunchen1007 2009-12-21 03:50:15
假如有类A,含有两个属性NO(int),NAME(string)。

现有List<A>,怎样将list里面No为某一值的元素去掉。



现有算法1:

public void RemoveItemFromList2(ref List<A> list, A item)
{
for (int i = 0; i < list.Count; i++)
{
if (list[i].NO == item.NO)
{
list.RemoveAt(i);
i--;//如果包含此元素,将其删除并且i减一位
}
}
}

但是感觉这样在循环的时候执行i--可能不是很好,

不知各位高手有没有好点的算法。

谢谢。

...全文
639 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangfan1981 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 kolosi 的回复:]

hoho

这个我是用反循环来弄的。
for (int i = list.Count - 1; i >= 0; i--)
{
if (list[i].NO == item.NO)
{
list.RemoveAt(i);
}
}
[/Quote]
cuisichao 2010-04-02
  • 打赏
  • 举报
回复
import java.util.ArrayList;
import java.util.List;

public class test{
public static void main(String[] args) {
List list = new ArrayList();
String []obc = null;
obc[1]="123";
obc[0]="123d";
obc[2]="123";
obc[3]="123";
obc[4]="123";

list.add("obc");
for(int i =0 ; i<list.size();i++){
String []arr=(String[])list.get(1);
}



}
}

高手们为什么 我写的这段代码 总是报错呢

!
! 为什么了 我都想了1分钟21秒了 都没有想出来了
绿色夹克衫 2010-01-02
  • 打赏
  • 举报
回复
用RemoveAll效率应该可以,他相当于一次遍历,把所有符合条件的元素都交换到List的前面,
然后一次性删除掉后面不符合条件的元素,效率是O(n)的,
如果是一条一条删,每删除一条之后都要把后面所有元素向前移动,效率是n^2的!
wuyq11 2009-12-21
  • 打赏
  • 举报
回复
var list2= list.Distinct();
wuyq11 2009-12-21
  • 打赏
  • 举报
回复
list.RemoveAll(delegate(Entity e)
{
return !list.Contains(e.Id);
});

myrroom 2009-12-21
  • 打赏
  • 举报
回复
这样是不行的 哥们要倒着删
i--
tianliang1 2009-12-21
  • 打赏
  • 举报
回复
学习。。。
xie_hai 2009-12-21
  • 打赏
  • 举报
回复
JF
kolosi 2009-12-21
  • 打赏
  • 举报
回复
hoho

这个我是用反循环来弄的。
for (int i = list.Count - 1; i >= 0; i--)
{
if (list[i].NO == item.NO)
{
list.RemoveAt(i);
}
}
wartim 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 lijunchen1007 的回复:]
谢谢14楼的。

不过如果用其它list的话,其实也不用重现Clone方法
        public void RemoveItemFromList(ref List <A> list, A item)
        {
            List <A> tempList = new List <A>();
            foreach (A a in list)
            {
                if (a.NO != item.NO && !tempList.Contains(a))
                    tempList.Add(a);
            }
            list = tempList;
        }

这样也可以。
[/Quote]

是,我的例子是2个list都要用,而且保证相互不影响
lijunchen1007 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 hitlcyu19 的回复:]
引用 3 楼 wyfde123 的回复:
直接用list.Remove(item);
不就行了?

对呀 你都知道了list跟其中的item 直接remove不就行了吗
[/Quote]
这个有点误解,其实不是删除这个item就够了,是删除list里面所有与item有同样NO的元素。
lijunchen1007 2009-12-21
  • 打赏
  • 举报
回复
谢谢14楼的。

不过如果用其它list的话,其实也不用重现Clone方法
public void RemoveItemFromList(ref List<A> list, A item)
{
List<A> tempList = new List<A>();
foreach (A a in list)
{
if (a.NO != item.NO && !tempList.Contains(a))
tempList.Add(a);
}
list = tempList;
}

这样也可以。
hitlcyu19 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wyfde123 的回复:]
直接用list.Remove(item);
不就行了?
[/Quote]
对呀 你都知道了list跟其中的item 直接remove不就行了吗
zhuxiaojun2002 2009-12-21
  • 打赏
  • 举报
回复
你既然要找list的某个属性等于多少的所有的结果
对list的扫描在所难免
lijunchen1007 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhuxiaojun2002 的回复:]
list.RemoveAll(delegate(A a) { return a.NO == 5; }
[/Quote]



public int RemoveAll(Predicate<T> match);
哈哈,这个方法还不错,还好用
让我想起了public void Sort(Comparison<T> comparison); 自定义List的排序条件
wartim 2009-12-21
  • 打赏
  • 举报
回复
再怎么循环也是跑不掉的
wartim 2009-12-21
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication250
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

List<A> X = new List<A>(new A[]
{
new A(1,"a"),
new A(2,"b"),
new A(3,"c")
});

List<A> Y = new List<A>();
foreach (A a in X)
if (a.NO != 2)
Y.Add((A)a.Clone());
}
}

class A : ICloneable
{
public int NO;
public String Name;

public A(int NO, String Name)
{
this.NO = NO;
this.Name = Name;
}

public object Clone()
{
return new A(NO, Name);
}
}
}
hhc123 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhuxiaojun2002 的回复:]
transmits.RemoveAll(delegate(TransmitInfo transmit) { return transmit.TRANSMIT_ID == transmitID; }
[/Quote]
这个表面上看只是代码简洁点,原理还是同楼主写的差不多,高效不到哪去
lijunchen1007 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 biny101 的回复:]
引用楼主 lijunchen1007 的回复:
     


他允许你直接删除吗,你没删除一次 list。count就会变化,这样貌似不行吧,再建一个list2,先添加到新的list2里面,然后循环完了,在删除list里面等于List2的值
[/Quote]
循环的话 count是就会变化
所以我每次删除一个后,我都执行i--。 这样就可以了。
像你说的这种方法,估计就要循环两次,可能速度不是很快
zhuxiaojun2002 2009-12-21
  • 打赏
  • 举报
回复
list.RemoveAll(delegate(A a) { return a.NO == 5; }
加载更多回复(10)

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧