В приведенном ниже примере показано значение predicate
для оценки состояния с жестко запрограммированным значением 100000. Невозможно добавить дополнительные параметры в метод FindPoints
, поскольку это нарушит предикатное ограничение параметра.Достоинство делегатов Полезность
Это приводит к вопросу использования предикатов. Очевидно, Лямбда решает эту проблему ... но тем не менее, может кто-нибудь объяснить полезность предикатов в реальных сценариях жизни, учитывая это, казалось бы, странное ограничение.
Почему кто-либо использует предикаты, если они не принимают параметры, отличные от T?
using System;
using System.Drawing;
public class Example
{
public static void Main()
{
// Create an array of Point structures.
Point[] points = { new Point(100, 200),
new Point(150, 250), new Point(250, 375),
new Point(275, 395), new Point(295, 450) };
// Define the Predicate<T> delegate.
Predicate<Point> predicate = FindPoints;
// Find the first Point structure for which X times Y
// is greater than 100000.
Point first = Array.Find(points, predicate);
// Display the first structure found.
Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y);
}
private static bool FindPoints(Point obj)
{
return obj.X * obj.Y > 100000;
}
}
// The example displays the following output:
// Found: X = 275, Y = 395
EDIT: Использование лямбда для того, чтобы сделать то же самое, ниже.
using System;
using System.Drawing;
public class Example
{
public static void Main()
{
// Create an array of Point structures.
Point[] points = { new Point(100, 200),
new Point(150, 250), new Point(250, 375),
new Point(275, 395), new Point(295, 450) };
// Find the first Point structure for which X times Y
// is greater than 100000.
Point first = Array.Find(points, x => x.X * x.Y > 100000);
// Display the first structure found.
Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y);
}
}
// The example displays the following output:
// Found: X = 275, Y = 395
Это MSDN. Статья дает хорошие примеры, но, похоже, не затрагивает мой вопрос.
lambda - это особый случай захвата (доступный с использованием анонимных методов с .NET 2.0), который, в свою очередь, является лишь частным случаем метода, позволяющего получать доступ к полям своего собственного класса, доступным с момента внедрения .NET. –