Добавление параметра в FindAll для общего списка на C#
Вопрос
У меня есть список объектов, которые я хочу отфильтровать по целочисленному параметру
List<testObject> objectList = new List<testObject>();
// populate objectList with testObjects
objectList.FindAll(GroupLevel0);
private static bool GroupLevel0(testObject item)
{ return item._groupLevel == 0; }
private class testObject
{
public string _FieldSQL = null;
public int _groupLevel;
}
Что я хочу сделать, так это заставить GroupLevel0 принимать целое число в качестве параметра вместо жесткого кодирования в 0.Я работаю в .NET 2.0, поэтому лямбда-выражения не подходят.Возможно ли вообще передать параметр в предикат?
Спасибо,
Решение
Если вы застряли на C # 2.0, используйте анонимный метод - просто немного более неуклюжее лямбда-выражение (игнорирующее деревья выражений).:
List<testObject> objectList = new List<testObject>();
int desiredGroupLevel = 10;
objectList.FindAll(delegate (testObject item)
{
return item._groupLevel == desiredGroupLevel;
});
Или вы все еще могли бы использовать вызов метода для начала:
List<testObject> objectList = new List<testObject>();
int desiredGroupLevel = 10;
objectList.FindAll(CheckGroupLevel(desiredGroupLevel));
...
public Predicate<testItem> CheckGroupLevel(int level)
{
return delegate (testItem item)
{
return item._groupLevel == level;
};
}
Если вы используете Visual Studio 2008, но нацеливание Однако в .NET 2.0 вы все еще можете использовать лямбда-выражение.Это просто трюк компилятора, который не требует поддержки фреймворка (опять же, игнорируя деревья выражений).
Другие советы
int groupLevel = 0;
objectList.FindAll(
delegate(testObject item)
{
return item._groupLevel == groupLevel;
});
Это анонимный делегат, он закрывает лексическую область своего родительского элемента, поэтому он может видеть "GroupLevel".
Работает на C # 2.0 и выше.Я бы рекомендовал использовать лямбда-выражение, если вы в будущем перейдете на .NET 3.5.
List<testObject> objectList = new List<testObject>();
// populate objectList with testObjects
objectList.FindAll(delegate(testObject o){ return GroupLevel(o, 0);} );
private static bool GroupLevel(testObject item, int groupLevel)
{ return item._groupLevel == groupLevel; }
Кроме того, если вы используете VS 2008, вы все еще можете использовать лямбды при компиляции в версию 2.0.Он использует компилятор 3.5 с целевой версией 2.0, и мы используем его в течение нескольких месяцев.