2012-11-01 162 views
0

我试图从绑定到中继器控件的Generic List中删除项目。从通用列表中删除项目

到目前为止,我已经有了一个remove方法应该的工作了(淘interwebs后):

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声明来查找以前的细节。

我在做什么错,怎么可能ix呢?

+1

复制LINQ的结果到一个新的列表,然后从成员中删除每个项目。 –

+0

@ L.B试图创建一个challenge.Member的新实例,将Linq语句复制到它,然后从成员中删除新的事件 - 无效。 – TheGeekZn

+0

你添加了一个'.ToList()'吗? –

回答

3

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

您也可以尝试List(T).RemoveAll()。请参阅LINQ: How to Use RemoveAll without using For loop with Array。这是比其他清单更简洁的解决方案。

+0

看起来好像我需要知道“通用列表”的大小才能工作? – TheGeekZn

+0

不,不是。应该像Members.RemoveAll(Members.Where(member => member.Name == lblMemberName.Text))一样简单; – CalC

+3

@NewAmbition,Cal:不,它是'Members.RemoveAll(member => member.Name == lblMemberName.Text);',它直接使用谓词。 – Rawling

0

修改您正在通过的列表是违法的。但是,您可以将其转换为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) 
} 
+0

:/我可以要求演示吗? – TheGeekZn

0

获取成员:

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

然后从列表中删除:

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