我正在尝试创建一个名为RemoveWhere的扩展方法,该方法基于谓词从List集合中删除项目。例如
var result = 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???
}
我不知道如何使用谓词。有人可以帮我完成这个吗?谢谢!
答案 0 :(得分:6)
列表中已有一个方法可以尝试。谓词应该是谓词然后你可以使用source.RemoveAll(谓词)
答案 1 :(得分:4)
Predicate参数应为:Func<T,bool>
public static List<T> RemoveWhere<T>(this List<T> source, Func<T, bool > 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???
var result = new List<T>();
foreach(var item in source)
{
if(!predicate(item))
{
result.Add(item);
}
}
return result;
}
编辑:正如其他人所指出的那样,这种方法要么命名错误,要么已经存在于List上。我的猜测只是你试图理解方法本身如何使用传入的委托。为此你可以看看我的样本。如果这不是你的意图,我将删除这个答案,因为代码真的没有意义。
答案 2 :(得分:2)
正如其他人所指出的那样,List<T>.RemoveAll
会做你想做的事。但是,如果这是学习体验,或者您希望对任何IList<T>
(没有RemoveAll
)进行操作,则应与RemoveAll
相同,但作为扩展方法。< / p>
public static void RemoveWhere<T>(this IList<T> source, Func<T, bool> predicate)
{
//exceptions here...
// how to use predicate here???
for(int c = source.Count-1 ; c >= 0 ; c--)
{
if(predicate(source[c]))
{
source.RemoveAt(c);
}
}
}
答案 3 :(得分:0)
正如博卡观察到的,List<T>
已经有了实现这一目标的方法。但是,一个更大的问题是,这实际上不是您应该创建新扩展方法的场景。已经存在一个带谓词的扩展方法:Where
。
当然,这样做:
var result = list.Where(x => x != 5).ToList();
比使用RemoveAll
更多的代码:
list.RemoveAll(x => x == 5);
可是:
list
实际上可以是任何IEnumerable<T>
,而不只是List<T>
,Where
方法是一种常用的,记录良好的扩展方法,任何合理技能的C#程序员都可以在视觉上识别ToList()
并枚举result
。我很难想象我想要为IEnumerable<T>
编写一个带谓词的扩展方法的情况。通过使您不能使用Where()
来保存很少。