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