سؤال

أنا باستخدام C#.

لذلك يجب كائن التي لديها بعض المجالات ، لا يهم حقا ما.لدي قائمة عامة من هذه الكائنات.

List<MyObject> myObjects = new List<MyObject>();
myObjects.Add(myObject1);
myObjects.Add(myObject2);
myObjects.Add(myObject3);

إذا كنت ترغب في إزالة الكائنات من قائمة على أساس بعض المعايير.فعلى سبيل المثال ، myObject.X >= 10. أود أن استخدام RemoveAll(Predicate<T> match) طريقة للقيام بذلك.

وأنا أعلم أنني يمكن أن تحدد مندوب والتي يمكن أن تنتقل إلى RemoveAll ، ولكن أود أن أعرف كيفية تعريف هذا مضمنة مع مجهول مندوب, بدلا من إنشاء مجموعة من تفويض المهام والتي تستخدم فقط في مكان مرة واحدة.

هل كانت مفيدة؟

المحلول

هناك اثنين من الخيارات صريح مندوب أو مندوبة زي لامبا بناء:

صراحة مندوب

myObjects.RemoveAll(delegate (MyObject m) { return m.X >= 10; });

امدا

myObjects.RemoveAll(m => m.X >= 10);

بالإضافة إلى ذلك:

أداء الحكمة كلاهما على قدم المساواة.كما واقع الأمر ، سواء بنيات اللغة تولد نفس IL عندما جمعت.هذا هو لأنه C# 3.0 هي في الأساس امتداد على C# 2.0 ، لذلك برمجيا إلى C# 2.0 بنيات :)

نصائح أخرى

لامدا C# 3.0 الطريقة:

myObjects.RemoveAll(m => m.x >= 10);

مجهول مندوب C# 2.0 الطريقة:

myObjects.RemoveAll(delegate (MyObject m) {
   return m.x >= 10;
});

و VB شباب VB 9.0 امدا الطريقة:

myObjects.RemoveAll(Function(m) m.x >= 10)

للأسف, لا دعم VB مجهول مندوب.

  //C# 2.0
  RemoveAll(delegate(Foo o){ return o.X >= 10; });

أو

  //C# 3.0
  RemoveAll(o => o.X >= 10);

أو

  Predicate<Foo> matches = delegate(Foo o){ return o.X >= 10; });
  //or Predicate<Foo> matches = o => o.X >= 10;
  RemoveAll(matches);

المسند هو المندوب الذي يأخذ المعلمة و إرجاع قيمة منطقية.

يمكننا أن نفعل نفس الشيء في الطرق التالية

1) باستخدام مضمنة التعبير امدا

RemoveAll(p=> p.x > 2);

2) باستخدام وظيفة مجهول

RemoveAll(delegate(myObject obj){

  return obj.x >=10;
})

3) باستخدام المسند مندوب

Predicate<myObject> matches = new Predicate<myObject>(IsEmployeeIsValid);
RemoveAll(matches);

Predicate<Foo> matches = delegate(Foo o){ return o.X >= 20; });
RemoveAll(matches);

3) أعلن مندوب explicitily لافتا إلى وظيفة

public delegate bool IsInValidEmployee (Employee emp);

IsInValidEmployee invalidEmployeeDelegate = new IsInValidEmployee(IsEmployeeInValid);
myObjects.RemoveAll(myObject=>invalidEmployeeDelegate(myObject);

// وظيفة فعلية

public static bool IsEmployeeInValid(Employee emp)
{
    if (emp.Id > 0 )
        return true;
    else
        return false;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top