【问题标题】:Removing item from a Generic List从通用列表中删除项目
【发布时间】:2012-11-01 08:42:06
【问题描述】:

我正在尝试从绑定到转发器控件的Generic List 中删除一个项目。

到目前为止,我有一个应该可以工作的删除方法(在搜索互联网之后):

Label lblMemberName = (Label)e.Item.FindControl("lblMemberName");        

switch (e.CommandName)
{
    case "RemoveMember":
        foreach (challenge.Member member in Members.Where(member => member.Name == lblMemberName.Text))
        {
            //This line doesnt work
            Members.Remove(member);
        }
        break;
}

很遗憾,此场景的实际删除部分不起作用。

我了解您无法创建要删除的 List<>new 实例。所以,这就是我使用Linq 语句查找之前的详细信息的原因。

我做错了什么,怎么可能修复它?

【问题讨论】:

  • 将 linq 的结果复制到一个新列表中,然后从 Members 中删除每个项目。
  • @L.B 尝试创建一个新的 challenge.Member 实例,将 Linq 语句复制到其中,然后从 Members 中删除该新实例 - 不起作用。
  • 您是否附加了.ToList()

标签: c# asp.net repeater generic-list


【解决方案1】:

如上所述,您不能在迭代集合时修改集合的内容。

你也可以试试List(T).RemoveAll()。请参阅LINQ: How to Use RemoveAll without using For loop with Array。这是一个比另一个列表更简洁的解决方案。

【讨论】:

  • 看来我需要知道Generic List 的大小才能正常工作?
  • 不,不是。应该像 Members.RemoveAll(Members.Where(member => member.Name == lblMemberName.Text)); 一样简单
  • @NewAmbition, Cal:不,是Members.RemoveAll(member => member.Name == lblMemberName.Text);,它直接接受谓词。
  • \:D/ Love all around.. 测试其他代码,我设法删除了所有内容>.<...>
  • 好地方。 +1 罗林。今天早上睡着了。很高兴它最终奏效了。
【解决方案2】:

修改您正在遍历的列表是非法的。但是,您可以将其转换为 for 循环而不是 foreach,然后对其进行修改。

for (int i=0; i < Members.Count; i++)
{
    if (Members[i].Name == lblMemberName.Text)
        Members.RemoveAt(i--); // decrement because we just shrunk the list)
}

【讨论】:

    【解决方案3】:

    获取会员:

    var member = Members.FirstOrDefault(i=>i.Name.Equals(thename));
    

    然后将其从列表中删除:

    if (member != null) 
    { 
        Members.Remove(member); 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-21
      • 2022-12-20
      • 2014-12-21
      • 2016-05-08
      • 2011-03-18
      • 1970-01-01
      • 2021-03-12
      相关资源
      最近更新 更多