Добавление параметра в FindAll для общего списка на C#

StackOverflow https://stackoverflow.com/questions/731337

Вопрос

У меня есть список объектов, которые я хочу отфильтровать по целочисленному параметру

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, и мы используем его в течение нескольких месяцев.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top