在Lambda表达式中添加事件

时间:2014-04-04 10:49:22

标签: c# .net lambda delegates

我有items的列表,并且要求如果提供了itemId,则会从列表中删除该ID的所有项目。意味着,同一个id列表中可以有多个项目。

private List<CartItem> items;
public void Remove(CartItem item)
{
    items.Remove(item);
    this.ItemRemoved(item); // This is call to an event whenever an item is removed from list.
}

Remove函数从列表中删除一个项目并引发一个事件。我希望每当删除多个项目时都这样做。

public void RemoveAll(int itemId)
{
    items.RemoveAll(item => item.ID == itemId); // Event here...
}

这里我想添加事件,以便每当删除多个项目时,可以为单个项目引发事件。如何在Lambda表达式中添加事件代码?

或者还有其他方法吗?

当我尝试这个时,编译器给我一个错误:

items.RemoveAll(item => { this.ItemRemoved(item); item.ID == itemId; });

错误:

Not all code paths return a value in lambda expression of type 'System.Predicate<ShoppingCart.ShoppingCart.Items.CartItem>'

这是我的活动:

public event ItemRemoved ItemRemoved; // ItemRemoved is a delegate.

谢谢!

1 个答案:

答案 0 :(得分:1)

尝试

items.RemoveAll(item => 
{
 if (item.ID == itemId) 
 { 
   // raise the event only for the items to be removed.
   this.ItemRemoved(item); 
   return true;
 }
 return false;
);

默认情况下,lambda表达式是单行返回语句。

有多行,我们需要将其视为任何匿名委托,这意味着代码块需要为RemoveAll方法显式返回一个布尔值。