ObservableCollection.Remove - 无法将lambda表达式转换为type,因为它不是委托类型

时间:2012-11-18 02:35:42

标签: c# c#-4.0

我偶然发现了这种非常奇怪的编译器行为。我试图根据某些条件从ObservableCollection中删除项目。以下是我的代码中出现的错误

public ObservableCollection<StandardContact> StandardContacts { get; set; }
....
StandardContacts.Remove(s => s.IsMarked); //Compiler Error

错误如下

Error Cannot convert lambda expression to type 'RelayAnalysis_Domain.Entity.StandardContact' because it is not a delegate type  

令人惊讶的是,下面的代码在同一方法中起作用

var deleteCount = StandardContacts.Where(s => s.IsMarked).Count(); //This Works

我的课程中已有以下导入

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.Entity;

这个问题可能是愚蠢的,但它让我头疼。

注意:即使是Intellisence也显示相同的错误

2 个答案:

答案 0 :(得分:3)

Observable collection的remove方法接受类型为T的输入(在本例中为StandardContract),而不是Func<T, bool>。如果此功能对您有用,您可以考虑为ICollection编写自己的扩展方法:

public static void RemoveWhere<T>(this ICollection<T> collection, Func<T, bool> predicate)     {
var i = collection.Count;
while(--i > 0) {
    var element = collection.ElementAt(i);
    if (predicate(element)) {
        collection.Remove(element);
    }
}

哪个可以这样使用:

StandardContacts.RemoveWhere(s => s.IsMarked)

答案 1 :(得分:2)

由于错误消息不清楚,您不能这样做。
ObservableCollection<T>没有删除符合条件的项的方法。 (与List<T>不同,后者有RemoveAll()

相反,您可以在集合中向后循环并调用Remove()