我有两个清单。第一个是所有团队成员 list1 和 第二个是选定的团队成员 list2 。我想删除所选 list1 中的团队成员 list2 项目这是我的代码,但它 没有。学生不会被删除。
foreach (var list in list2.ToList())
{
if (list1.Contains(list))
{
list1.Remove(list);
}
}
答案 0 :(得分:4)
以下将从list1中删除项目:
list1.RemoveAll(l => list2.Contains(l));
替代解决方案 - 您可以使用list1中的项目创建新列表,但list2中的项目除外(注意 - 它也会删除重复项目):
var result = list1.Except(list2).ToList();
如果您只需要枚举结果,那么您甚至无需创建列表 - 您可以删除ToList()
来电。
注意:如果您正在处理自定义对象而不是基本类型(int,string等),那么默认情况下,您的对象将通过引用进行比较。即如果对象的所有字段都相等,但这是您的类的不同实例,那么它们将被视为不相等。要按字段值比较对象,您应该覆盖类的Equals
和GetHashCode
方法,或者为您的类创建自定义比较器。
答案 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");
}