#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;
}