【发布时间】:2011-06-22 17:48:50
【问题描述】:
我正在尝试创建一个名为 RemoveWhere 的扩展方法,该方法根据谓词从 List 集合中删除一个项目。例如
var 结果 = products.RemoveWhere(p => p.ID == 5);
我使用 Microsoft 的 Where 扩展方法签名作为起点。到目前为止,这是我所拥有的:
public static List<T> RemoveWhere<T>(this List<T> source, Func<T, List<T>> predicate)
{
if (source == null)
{
throw new ArgumentNullException("source", "The sequence is null and contains no elements.");
}
if (predicate == null)
{
throw new ArgumentNullException("predicate", "The predicate function is null and cannot be executed.");
}
// how to use predicate here???
}
我不知道如何使用谓词。有人可以帮我完成这个吗?谢谢!
【问题讨论】:
-
让我们从批评你目前所拥有的开始。为什么该方法返回一个列表?它是否返回一个 new 列表并删除了项目,并保持源列表不变?还是从源列表中删除项目?如果是前者,那么您错误地说明了您的方法的作用。如果是后者,那么返回值的含义是什么?为什么要退货?
-
接下来,为什么谓词取一个项目并返回一个项目列表?根据定义,谓词是一个返回bool的函数。
-
错了,你可以改用
System.Predicate类型。 -
使用列表的 RemoveAll 方法。它需要一个谓词作为参数。请参阅下面的答案
-
第三,你为什么要这样做?如果这是一个学习练习,那就太好了——弄清楚如何编写已经存在的功能是了解该功能的绝佳方式。但是,如果您是为了实际工作而这样做,为什么不使用 List
.RemoveAll?这似乎完全符合您的要求。
标签: c# visual-studio linq extension-methods