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

4

我发现了一种非常奇怪的编译器行为。我正在尝试根据某些条件从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;

这个问题可能看起来很傻,但却让我困扰了好一阵子。

提示:即使智能感知也显示相同的错误。

2个回答

4
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)

3
正如错误信息不清楚地指出的那样,你不能这样做。
ObservableCollection<T>没有删除匹配条件项的方法。(与具有RemoveAll()List<T>不同)
相反,您可以反向循环遍历集合并调用Remove()

我真的很愚蠢地发布了这个问题。我在另一个项目中有类似的方法,并且我认为它与默认的扩展方法捆绑在一起。但实际上,我是为那个项目自定义了这个扩展方法。所以我只需要在我的当前项目中编写一个自定义的扩展方法即可。 - Jatin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接