从列表中删除项目的难度

时间:2014-01-14 07:01:10

标签: c# .net linq

我有两个清单。第一个是所有团队成员 list1 和 第二个是选定的团队成员 list2 。我想删除所选 list1 中的团队成员 list2 项目这是我的代码,但它 没有。学生不会被删除。

foreach (var list in list2.ToList())
{
   if (list1.Contains(list))
   {
       list1.Remove(list);
   }
}

3 个答案:

答案 0 :(得分:4)

以下将从list1中删除项目:

list1.RemoveAll(l => list2.Contains(l));

替代解决方案 - 您可以使用list1中的项目创建新列表,但list2中的项目除外(注意 - 它也会删除重复项目):

var result = list1.Except(list2).ToList();

如果您只需要枚举结果,那么您甚至无需创建列表 - 您可以删除ToList()来电。


注意:如果您正在处理自定义对象而不是基本类型(int,string等),那么默认情况下,您的对象将通过引用进行比较。即如果对象的所有字段都相等,但这是您的类的不同实例,那么它们将被视为不相等。要按字段值比较对象,您应该覆盖类的EqualsGetHashCode方法,或者为您的类创建自定义比较器。

答案 1 :(得分:1)

如果列表包含字符串,您的代码应该有用。我怀疑你的两个列表包含每个学生的不同对象 - 因此,list1中Jim的对象与Jim在list2中的对象不同。

答案 2 :(得分:0)

此代码对我有用,我认为这可以解决您的问题

    List<String> planguages=new ArrayList<String>();
    planguages.add("Ajax");
    planguages.add("Java");
    planguages.add("Python");

    List<String> planguages2=new ArrayList<String>();
    planguages2.add("Ajax");
    planguages2.add("Java");
    planguages2.add("Python");
    planguages2.add("C#");
    planguages2.add("c++");

    if(planguages2.containsAll(planguages)){
        planguages2.removeAll(planguages);
        System.out.println(planguages2.size());
        System.out.println("ok");
    }else{
        System.out.println("nok");
    }