<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msdnphilippines.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Drinking .NET with LaTtEX : generics, predicates</title><link>http://msdnphilippines.net/blogs/limjap/archive/tags/generics/predicates/default.aspx</link><description>Tags: generics, predicates</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Combining generic predicates in C#</title><link>http://msdnphilippines.net/blogs/limjap/archive/2009/02/03/combining-generic-predicates-in-c.aspx</link><pubDate>Mon, 02 Feb 2009 15:50:00 GMT</pubDate><guid isPermaLink="false">019a604b-fb74-42d5-8a6d-7cedfb08f61c:95</guid><dc:creator>Jon Limjap</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msdnphilippines.net/blogs/limjap/rsscomments.aspx?PostID=95</wfw:commentRss><comments>http://msdnphilippines.net/blogs/limjap/archive/2009/02/03/combining-generic-predicates-in-c.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ve got a requirement wherein I needed to have a way to make dynamic predicates, with the need to support for And and Or operations between two predicates. I was aware that there are ways to create &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx"&gt;Dynamic LINQ queries&lt;/a&gt; if I wanted to use LINQ to Objects (I was using these on generic lists anyway), but a voice at the back of my head told me there would be a much simpler solution.&lt;/p&gt;
&lt;p&gt;I was astounded at how simple it turned out:&lt;/p&gt;

&lt;pre lang="cpp"&gt;
    public static class PredicateExtensions
    {
        public static Predicate And
            (this Predicate original, Predicate newPredicate)
        {
            return t =&amp;gt; original(t) &amp;amp;&amp;amp; newPredicate(t);
        }

        public static Predicate Or
            (this Predicate original, Predicate newPredicate)
        {
            return t =&amp;gt; original(t) || newPredicate(t);
        }
    }
&lt;/pre&gt;

&lt;p&gt;Of course the assumption here is that the logic operations are simple.&lt;/p&gt;

&lt;p&gt;The following are the tests to show how it works. Needless to say, the lambda expressions can be replaced by any method following the Predicate delegate:&lt;p&gt;
&lt;pre lang="cpp"&gt;
    [TestFixture]
    public class PredicateExtensionsTest
    {
        [Test]
        public void PredicateExtension_And_method_performs_an_and_between_orig_and_new_predicates()
        {
            int t1 = 1;

            Predicate orig = t =&amp;gt; t == 1;
            Predicate newPredicate = t =&amp;gt; (t + 1) == 2;
            Predicate falsing = t =&amp;gt; (t - 1) == -1;

            Predicate origAndNew = orig.And(newPredicate);
            Predicate origAndFalsing = orig.And(falsing);

            Assert.IsTrue(orig(t1));
            Assert.IsTrue(origAndNew(t1));
            Assert.IsFalse(origAndFalsing(t1));
        }

        [Test]
        public void PredicateExtension_Or_method_performs_an_or_between_orig_and_new_predicates()
        {
            int t1 = 1;

            Predicate orig = t =&amp;gt; t == 1;
            Predicate newPredicate = t =&amp;gt; (t + 1) == 2;
            Predicate falsing = t =&amp;gt; (t - 1) == -1;

            Predicate origOrNew = orig.Or(newPredicate);
            Predicate origOrFalsing = orig.Or(falsing);

            Assert.IsTrue(orig(t1));
            Assert.IsTrue(origOrNew(t1));
            Assert.IsTrue(origOrFalsing(t1));
        }
    }
&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msdnphilippines.net/aggbug.aspx?PostID=95" width="1" height="1"&gt;</description><category domain="http://msdnphilippines.net/blogs/limjap/archive/tags/generics/default.aspx">generics</category><category domain="http://msdnphilippines.net/blogs/limjap/archive/tags/predicates/default.aspx">predicates</category><category domain="http://msdnphilippines.net/blogs/limjap/archive/tags/c_2300_/default.aspx">c#</category></item></channel></rss>