Добавление параметра в FindAll для универсального списка в C # - PullRequest
5 голосов
/ 08 апреля 2009

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

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, поэтому лямбда-выражения не нужны. Можно ли передать параметр в предикат?

Спасибо,

Ответы [ 3 ]

7 голосов
/ 08 апреля 2009

Если вы застряли в 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, вы все равно можете использовать лямбда-выражение. Это просто трюк компилятора, который не требует поддержки фреймворка (опять же, игнорируя деревья выражений).

2 голосов
/ 08 апреля 2009
  int groupLevel = 0;

  objectList.FindAll(
       delegate(testObject item) 
       { 
          return item._groupLevel == groupLevel; 
       });

Это анонимный делегат, он закрывает лексическую область своего родителя, поэтому он может видеть "groupLevel".

Работает в C # 2.0 и выше. Я бы порекомендовал использовать лямбду, если в будущем вы перейдете на .NET 3.5.

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

...