Visual Studio C# System.Collections.Generic.Icollection< > does not contain definition for RemoveAll

qvtsj1bj  于 2023-05-07  发布在  C#
关注(0)|答案(2)|浏览(161)

这是一些代码的一部分,在我同事的机器上工作得很好,但是当我试图编译解决方案时,我得到了错误:
“System.Collections.Generic.ICollection”不包含“RemoveAll”的定义,并且找不到接受类型为“System.Collections.Generic.ICollection”的第一个参数的扩展方法“RemoveAll”(是否缺少using指令或程序集引用?)
我反复核对了我们的参考资料,他们似乎是匹配的。我引用了System.Linq和EntityFramework。我尝试了清理和重新编译,但这个错误仍然存在。

public void CleanClearinghouse()
{
    this.ClearinghousePartners.RemoveAll(
        x =>
            string.IsNullOrWhiteSpace(x.ClearingHouseName) &&
            string.IsNullOrWhiteSpace(x.TradingPartnerName) && !x.StartDate.HasValue);
}

我有一种感觉,我错过了一个程序集引用或类似的东西。我将感谢任何关于在哪里寻找解决方案的提示,但没有修改代码的建议。

2guxujil

2guxujil1#

ICollection<T>确实不包含名为RemoveAll的方法。拥有RemoveAll的类是List<T>,它可能是变量的实际具体类型。
但是,如果属性的类型是ICollection,编译器就无法知道它实际上是一个List。
比如说,像这样:

public class MyClass 
{
    public ICollection<string> ClearinghousePartners {get;set;}
    public MyClass() 
    {
        ClearingHousePartners = new List<string>();
    }
}

不会编译,因为List<string>被公开为ICollection<string>
修复它的一种方法是将属性定义更改为List<T>而不是ICollection

gblwokeq

gblwokeq2#

由于ICollection没有RemoveAll,如果你想保留已有的代码,一个选择是自己实现RemoveAll,如下所示:

public static void RemoveAll<T>(this ICollection<T> collection, Predicate<T> match) 
    where T : ClearinghousePartners
{
    if (match == null)
        throw new ArgumentNullException("match");

    collection.Where(entity => 
        match(entity)).ToList().ForEach(entity => collection.Remove(entity));
}

注意:这是一个扩展方法,因此需要放入静态类中。

相关问题