3

我偶然发现了这种非常奇怪的编译器行为。我正在尝试根据某些条件从 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 也会显示相同的错误

4

2 回答 2

3

Observable 集合的 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)
于 2012-11-18T02:41:21.330 回答
2

正如错误消息未明确指出的那样,您不能这样做。
ObservableCollection<T>没有删除符合条件的项目的方法。(不像List<T>, 有RemoveAll()

相反,您可以向后循环遍历集合并调用Remove().

于 2012-11-18T02:38:30.493 回答