从列表集合中删除项目无法删除

5
我正在处理一个集合。我需要从这个集合中移除一项并使用筛选/删除后的集合。
以下是我的代码:
public class Emp{
  public int Id{get;set;}
  public string Name{get;set;}
}

List<Emp> empList=new List<Emp>();
Emp emp1=new Emp{Id=1, Name="Murali";}
Emp emp2=new Emp{Id=2, Name="Jon";}
empList.Add(emp1);
empList.Add(emp2);

//Now i want to remove emp2 from collection and bind it to grid.
var item=empList.Find(l => l.Id== 2);
empList.Remove(item);

问题是即使在删除项目后,我的集合仍然显示计数为2。可能的问题是什么?
编辑:
原始代码
  var Subset = otherEmpList.FindAll(r => r.Name=="Murali");

   if (Subset != null && Subset.Count > 0)
   {
    foreach (Empl remidateItem in Subset )
    {
       Emp removeItem = orginalEmpList.Find(l => l.Id== 
                                          remidateItem.Id);
                    if (removeItem != null)
                    {
                        orginalEmpList.Remove(remidateItem); // issue here

                    }
      }
    }

它工作得很好。在实际代码中,我正在删除 remediateItem。remediateItem 是相同类型但属于不同集合的内容。

你能展示一下你的实际代码吗?目前这份代码无法编译。当你修复后提供的代码是可行的。 - Simon Whitehead
1
你的问题是在从集合中删除项目还是更新UI?也许项目已经成功地从集合中删除,但UI还没有更新。 - Sina Iravanian
是的。当你修复编译错误后,运行代码似乎是有效的。 - DJ Burb
我需要根据另一个集合来进行多个筛选。目前使用循环实现了更新的代码。还有其他方法可以实现吗? - Murali Murugesan
@Murali 我不认为有必要删除这个问题。这个问题已经有了答案,请标记其中一个答案作为正确答案,或者添加你自己的答案。 - daryal
5个回答

11

您正在将不在要删除的列表中而是在其他列表中的对象传递给Remove方法,这就是它们没有被删除的原因。请使用List.RemoveAll方法传递谓词。

lst.RemoveAll(l => l.Id== 2);

如果你想从其他集合(如 id 数组)中删除多个 id

int []ids = new int[3] {1,3,7};
lst.RemoveAll(l => ids.Contains(l.Id))

这个会从列表中移除所有的元素,但他只想要移除其中一个。 - A.Goutam
我已经在内部给出了条件,它将仅删除满足作为参数给定条件的内容。 - Adil
如果你想删除名为Murali的项,可以这样做:lst.RemoveAll(l => l.Name== "Murali") - Adil
实际上,我将根据ID进行删除。它们是未知的,所以需要循环。 - Murali Murugesan
你需要将这些id传递给谓词检查我的更新答案,我已经添加了从数组中删除id的功能。 - Adil
显示剩余2条评论

1
int removeIndex = list.FindIndex(l => e.Id== 2);
if( removeIndex != -1 )
{
    list.RemoveAt(removeIndex);
}

尝试这个,也许对你有用。

1

你刚才粘贴的原始代码完美地运行了,它可以相应地移除项目。

List<Emp> empList = new List<Emp>();
Emp emp1 = new Emp { Id = 1, Name = "Murali" };
Emp emp2 = new Emp { Id = 2, Name = "Jon" };
empList.Add(emp1);
empList.Add(emp2);

//Now i want to remove emp2 from collection and bind it to grid.
var item = empList.Find(l => l.Id == 2);
empList.Remove(item);

0

你的 Lambda 写错了,应该是这样的

var item=empList.Find(l => l.Id== 2);

抱歉,我不小心更新了问题。但是在代码中它是正确的并且正在构建。 - Murali Murugesan

-1
您需要在Remove()方法下方添加以下内容:

orginalEmpList.SaveChanges();


您的答案可以通过附加支持信息来改进。请编辑以添加更多详细信息,如引用或文档,以便他人可以确认您的答案是否正确。您可以在帮助中心中找到有关编写良好答案的更多信息。 - Community
问题是关于如何从一个通用列表中删除元素。这不涉及EF和将记录保存到数据库中。 - Kai Thoma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接