Как бы я определил этот предикат как функцию?

#c# #.net #predicate

#c# #.net #предикат

Вопрос:

Не уверен, что у меня есть правильное название на этом, не стесняйтесь поправить меня.

У меня есть код, похожий на следующий:

 string myValue = "aaa";
List<ListItem> myList = CreateMyList();
myList.Find(t=>t.Value == myValue );
 

Я хотел бы создать функцию предиката, которая делает то же самое. Я могу реализовать это, если мне не нужно проходить в myValue :

    ...
   List<ListItem> myList = CreateMyList();
   myList.Find(SelectByValue);
   ...
}

static bool SelectByValue(ListItem li)
{                      //***myValue is now hardcoded***
    return li.Value == "aaa";
}
 

Но я хотел бы иметь возможность указать, каким должно быть «aaa», когда я вызываю функцию предиката. Как это можно сделать?

Ответ №1:

Вместо того, чтобы возвращать bool, сделайте так, чтобы он возвращал Predicate<ListItem> :

 static Predicate<ListItem> SelectByValue(String target)
{
    return delegate(ListItem li) { return li.Value == target; };
}
 

Затем вызовите метод:

 myList.Find(SelectByValue("foo"));
 

Обратите внимание, что C # 3 вводит лямбда-выражения, что делает это немного проще:

 static Predicate<ListItem> SelectByValue(String target)
{
    return li => li.Value == target;
}
 

… и в .NET 3.5 и выше, как правило, более идиоматично использовать LINQ, чем List<T> специфические методы.

Ответ №2:

 static Predicate<ListItem> SelectByValue(string value)
{
    return item=>li.Value == value;
}