Friday, August 27, 2010

What is a "Predicate delegate"?

(http://bytes.com/topic/c-sharp/answers/474304-what-predicate-delegate)


A delegate is like a function pointer. A Predicate delegate is a very cool
use of Delegates which is used with various Generic Lists, Arrays and
Collections. Since a Generic List does not specify a data type, that is, the
data type of the items in the List is set with a type parameter, how would
one write a Find() function for a Generic List? Since nothing is known about
the data type being searched for, one cannot know what sort of condition is
used to discriminate between one item and another.


The Predicate delegate is a Generic method which takes an object of type T
as a parameter. It returns true or false, indicating whether or not the
object of type T satisfies the condition it tests. The Predicate delegate is
assigned the same type as the List when the List type parameter is passed to
the instance of the Generic List created. The author of the code knows what
the data type is, and can write a method that works with the type passed to
test it and see whether it is whatever the author wants it to be. The Find()
method uses the Predicate delegate method created to test each item in the
List, and returns the first item in the List for which the Predicate
delegate returns true

As an example, let's say that we have a Generic List of type Int32:

private List Numbers = new List();

You want to find the first item in the List that is less than 5. So, you
create your method:

private static bool IsLessThanFive(int i)
{
return (i < 5);
}


int result = Numbers.Find(new Predicate(IsLessThanFive);


The IsLessThanFive Predicate delegate is called for each item in the list,
passing that item as the parameter, until one of the calls returns true.
That is the number that is assigned to result.

In addition you can use anonymous methods and delegate inference to write it all in one line of code.

int result = Numbers.Find(delegate(int i) { return i < 5; });


Atlast, the same is acheivable even without using predicates, Lamda, Anonymous methods ) mimimal knowledge in c# is good enough, to achieve any complex behaviour. However basic understanding of all above is necessary for new technologies in .NET might be.

No comments: