List <object> .RemoveAll - 如何创建适当的谓词

CJM*_*CJM 42 c# generics lambda delegates predicate

这是一个noob问题 - 我仍然是C#和泛型的新手,对谓词,委托和lambda表达式来说是全新的......

我有一个"查询"课程,其中包含另一个名为"车辆"的课程的通用列表.我正在构建代码以从父查询添加/编辑/删除车辆.而目前,我特别关注删除.

从我到目前为止所看到的,似乎我可以使用Vehicles.RemoveAll()来删除具有特定VehicleID的项目或具有特定EnquiryID的所有项目.我的问题是理解如何提供.删除所有正确的谓词 - 我看到的例子过于简单化(或者由于我对谓词,委托和lambda表达式缺乏了解,我可能过于简单化).

因此,如果我有一辆List<Of Vehicle> Vehicles车在哪里有一个EnquiryID,我将如何使用Vehicles.RemoveAll()移除给定EnquiryID的所有车辆?

我知道有几种方法,所以我很想听到方法之间的差异 - 尽管我需要一些工作,这也是一个学习练习.

作为补充问题,通用列表是这些对象的最佳存储库吗?我的第一个倾向是收藏品,但看起来我已经过时了.当然,仿制药似乎更受欢迎,但我对其他替代品感到好奇.

Ang*_*Bad 86

这些RemoveAll()方法接受一个Predicate<T>委托(直到这里没有新的东西).谓词指向一个简单返回true或false的方法.当然,RemoveAll将从集合中删除所有在T应用谓词时返回True 的实例.

C#3.0允许开发人员使用多种方法将谓词传递给RemoveAll方法(而不仅仅是这个...).您可以使用:

Lambda表达式

vehicles.RemoveAll(vehicle => vehicle.EnquiryID == 123);
Run Code Online (Sandbox Code Playgroud)

匿名方法

vehicles.RemoveAll(delegate(Vehicle v) {
  return v.EnquiryID == 123;
});
Run Code Online (Sandbox Code Playgroud)

正常方法

vehicles.RemoveAll(VehicleCustomPredicate);
private static bool
VehicleCustomPredicate (Vehicle v) {
    return v.EnquiryID == 123; 
}
Run Code Online (Sandbox Code Playgroud)


Qua*_*ter 15

T中的谓词是一个代理,它接受一个T并返回一个bool.List <T> .RemoveAll将删除列表中调用谓词的所有元素返回true.提供简单谓词的最简单方法通常是lambda表达式,但您也可以使用匿名方法或实际方法.

{
    List<Vehicle> vehicles;
    // Using a lambda
    vehicles.RemoveAll(vehicle => vehicle.EnquiryID == 123);
    // Using an equivalent anonymous method
    vehicles.RemoveAll(delegate(Vehicle vehicle)
    {
        return vehicle.EnquiryID == 123;
    });
    // Using an equivalent actual method
    vehicles.RemoveAll(VehiclePredicate);
}

private static bool VehiclePredicate(Vehicle vehicle)
{
    return vehicle.EnquiryID == 123;
}
Run Code Online (Sandbox Code Playgroud)


adr*_*nks 6

这应该工作(enquiryId你需要匹配的id 在哪里):

vehicles.RemoveAll(vehicle => vehicle.EnquiryID == enquiryId);
Run Code Online (Sandbox Code Playgroud)

这样做是将列表中的每个车辆传递给lambda谓词,评估谓词.如果谓词返回true(即.vehicle.EnquiryID == enquiryId),则当前车辆将从列表中删除.

如果您知道集合中对象的类型,那么使用泛型集合是一种更好的方法.它避免了从集合中检索对象时的转换,但如果集合中的项是值类型(这可能会导致性能问题),也可以避免装箱.