<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/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>.NET Framework</title><link>https://www.dotnetzone.gr:443/cs/forums/14/ShowForum.aspx</link><description>Θέματα για threading, remoting, reflection, exception handling, security, regex κλπ.</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Pattern matching σε C#;</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/58038.aspx</link><pubDate>Mon, 12 Apr 2010 19:05:27 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:58038</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/58038.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=58038</wfw:commentRss><description>Τώρα με το .NET 4 μπορείς να εκτελέσεις όλα τα conditions παράλληλα με ένα Parallel.ForEach ή ένα AsParallel, αν και μπορεί να σου βγει πιό&amp;nbsp; .... αργή λύση αν έχεις λίγα patterns και απλά conditions.</description></item><item><title>Απ: Pattern matching σε C#;</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/58032.aspx</link><pubDate>Mon, 12 Apr 2010 17:41:56 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:58032</guid><dc:creator>anjelinio</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/58032.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=58032</wfw:commentRss><description>&lt;P&gt;Ρε φίλε ... βαριόμουν απίστευτα να γράψω ακόμα ένα switch statement και έψαχνα κάτι ενδιαφέρον !!! χαχαχαχααα :)&lt;/P&gt;
&lt;P&gt;Άντε, καλή εβδομάδα μας !&lt;/P&gt;</description></item><item><title>Απ: Pattern matching σε C#;</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/58014.aspx</link><pubDate>Sat, 10 Apr 2010 05:57:02 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:58014</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/58014.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=58014</wfw:commentRss><description>&lt;div&gt;Καλησπέρα στους φίλους Άγγελο-Παναγιώτη.&lt;/div&gt;&lt;div&gt;Άγγελε πως και θυμήθηκες αυτό το thread?&lt;/div&gt;</description></item><item><title>Απ: Pattern matching σε C#;</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/58010.aspx</link><pubDate>Fri, 09 Apr 2010 20:00:00 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:58010</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/58010.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=58010</wfw:commentRss><description>&lt;P&gt;Κοίτα τί πήγες και θυμήθηκες. Εν τω μεταξύ έχω χαζέψει τόσο πολύ με το Sharepoint, που μου πήρε 15 λεπτά για να καταλάβω όχι τη συζήτηση, αλλά αυτό που είχα απαντήσει τότε!&lt;/P&gt;
&lt;P&gt;Τώρα που τα θυμήθηκα και με κατάλαβα, διαπιστώνω ότι έχω αλλάξει άποψη. lambdas, pattern matching και τα συναφή δεν είναι μόνο για βιβλιοθήκες ούτε είναι χρήσιμα μόνο στους guru - και ειδικά λόγω προϊόντων όπως το Sharepoint, όπου ένα SPItem μπορεί να είναι διαφορετικού τύπου, με διαφορετικά πεδία και διαφορετικό χειρισμό, το schema μπορεί να αλλάξει οποιαδήποτε στιγμή κλπ κλπ κλπ ακόμα και αν προέρχεται από την ίδια λίστα με ένα άλλο. Δυναμική εφαρμογή με στατικό API, μπλιάχ! &lt;/P&gt;
&lt;P&gt;Τώρα που πείσθηκα κι εγώ είπα να δοκιμάσω τί θα βγάλω με τη μέθοδο του ... Resharper. Βάζουμε δηλαδή τη σύνταξη και μέσω Resharper δημιουργούμε κώδικα μέχρι να κάνει compile. Κατέληξα στο παρακάτω (έκλεψα και λίγο επειδή χρησιμοποιώ Tuple&amp;lt;&amp;gt;).&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:black;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;class&lt;/SPAN&gt; MatchResult&amp;lt;TValue,TResult&amp;gt;
    {
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;private&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;readonly&lt;/SPAN&gt; List&amp;lt;Tuple&amp;lt;Func&amp;lt;TValue, &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;bool&lt;/SPAN&gt;&amp;gt;, Func&amp;lt;TValue, TResult&amp;gt;&amp;gt;&amp;gt; _patterns=&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;new&lt;/SPAN&gt; List&amp;lt;Tuple&amp;lt;Func&amp;lt;TValue, &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;bool&lt;/SPAN&gt;&amp;gt;, Func&amp;lt;TValue, TResult&amp;gt;&amp;gt;&amp;gt;();
        
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;public&lt;/SPAN&gt; MatchResult&amp;lt;TValue,TResult&amp;gt; With(Func&amp;lt;TValue, &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;bool&lt;/SPAN&gt;&amp;gt; condition, Func&amp;lt;TValue, TResult&amp;gt; action)
        {
            _patterns.Insert( 0,Tuple.Create(condition, action));
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;return&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;this&lt;/SPAN&gt;;
        }

        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;public&lt;/SPAN&gt; MatchResult&amp;lt;TValue, TResult&amp;gt; Else(Func&amp;lt;TResult&amp;gt; action)
        {
            _patterns.Add(&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;new&lt;/SPAN&gt; Tuple&amp;lt;Func&amp;lt;TValue, &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;bool&lt;/SPAN&gt;&amp;gt;, Func&amp;lt;TValue, TResult&amp;gt;&amp;gt;(v=&amp;gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;true&lt;/SPAN&gt;, v=&amp;gt; action()));
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;return&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;this&lt;/SPAN&gt;;
        }

        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;public&lt;/SPAN&gt; TResult Match(TValue value)
        {

            var match &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:red;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;=&lt;/SPAN&gt; (from pattern &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;in&lt;/SPAN&gt; _patterns
                         where pattern.Item1(value)
                         select pattern.Item2).FirstOrDefault();
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;return&lt;/SPAN&gt; match == &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;null&lt;/SPAN&gt; ? &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;default&lt;/SPAN&gt;(TResult) : match(value);
        }
    }

    &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;static&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;class&lt;/SPAN&gt; PatternMatch
    {
        &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;static&lt;/SPAN&gt; MatchResult&amp;lt;TValue,TResult&amp;gt; With&amp;lt;TValue, TResult&amp;gt;(Func&amp;lt;TValue, &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;bool&lt;/SPAN&gt;&amp;gt; condition, Func&amp;lt;TValue, TResult&amp;gt; action)
        {
            &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;return&lt;/SPAN&gt; &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;new&lt;/SPAN&gt; MatchResult&amp;lt;TValue, TResult&amp;gt;().With(condition, action);
        }
    }&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;το οποίο βγαίνει μάλλον απλούστερο από τις προηγούμενες λύσεις. Μήπως ξέχασα τίποτε ? BTW, όταν αρχίζεις να παίζεις με τα tuples, αρχίζουν να σου λείπουν τα typedef.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description></item><item><title>Απ: Pattern matching σε C#;</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/58009.aspx</link><pubDate>Fri, 09 Apr 2010 18:43:56 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:58009</guid><dc:creator>anjelinio</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/58009.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=58009</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://www.dotnetzone.gr/cs/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;PALLADIN:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;
&lt;P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;FONT face=Tahoma size=2&gt;Τα ανακατεύουμε καλά και ορίστε το αποτέλεσμα&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;var pattern &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;PatternMatch.With&amp;lt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;int&lt;/SPAN&gt;, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;string&lt;/SPAN&gt;&amp;gt;(value =&amp;gt; value == 1, value =&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"One "&lt;/SPAN&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.With(value =&amp;gt; value == 2, value =&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"Two "&lt;/SPAN&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.With(value =&amp;gt; value == 3, value =&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"Three "&lt;/SPAN&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Else(() =&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"Else"&lt;/SPAN&gt;);&lt;BR&gt;&lt;BR&gt;Console.WriteLine(pattern.Match(4));&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;/P&gt;
&lt;P&gt;... ένας διάλογος που κρατάει ... &lt;EM&gt;3 χρόνια&lt;/EM&gt; ! :D&amp;nbsp; Ωραίο syntax ρε Νικόλα. &lt;/P&gt;</description></item><item><title>Απ: Pattern matching σε C#;</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/46086.aspx</link><pubDate>Fri, 07 Nov 2008 22:53:51 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:46086</guid><dc:creator>Δημήτρης Γκανάτσιος</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/46086.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=46086</wfw:commentRss><description>&lt;P&gt;Δείτε και posts του Bart De Smet πάνω στο θέμα&lt;/P&gt;
&lt;P&gt;&lt;A href="http://community.bartdesmet.net/blogs/bart/archive/2008/04/06/pattern-matching-in-c-part-0.aspx"&gt;http://community.bartdesmet.net/blogs/bart/archive/2008/04/06/pattern-matching-in-c-part-0.aspx&lt;/A&gt;&lt;BR&gt;&lt;A href="http://community.bartdesmet.net/blogs/bart/archive/2008/04/06/pattern-matching-in-c-part-1.aspx"&gt;http://community.bartdesmet.net/blogs/bart/archive/2008/04/06/pattern-matching-in-c-part-1.aspx&lt;/A&gt;&lt;BR&gt;&lt;A href="http://community.bartdesmet.net/blogs/bart/archive/2008/04/06/pattern-matching-in-c-part-2.aspx"&gt;http://community.bartdesmet.net/blogs/bart/archive/2008/04/06/pattern-matching-in-c-part-2.aspx&lt;/A&gt;&lt;BR&gt;&lt;A href="http://community.bartdesmet.net/blogs/bart/archive/2008/04/06/pattern-matching-in-c-part-3.aspx"&gt;http://community.bartdesmet.net/blogs/bart/archive/2008/04/06/pattern-matching-in-c-part-3.aspx&lt;/A&gt;&lt;BR&gt;&lt;A href="http://community.bartdesmet.net/blogs/bart/archive/2008/04/06/pattern-matching-in-c-part-4.aspx"&gt;http://community.bartdesmet.net/blogs/bart/archive/2008/04/06/pattern-matching-in-c-part-4.aspx&lt;/A&gt;&lt;BR&gt;&lt;A href="http://community.bartdesmet.net/blogs/bart/archive/2008/04/06/pattern-matching-in-c-part-5.aspx"&gt;http://community.bartdesmet.net/blogs/bart/archive/2008/04/06/pattern-matching-in-c-part-5.aspx&lt;/A&gt;&lt;BR&gt;&lt;A href="http://community.bartdesmet.net/blogs/bart/archive/2008/04/06/pattern-matching-in-c-part-6.aspx"&gt;http://community.bartdesmet.net/blogs/bart/archive/2008/04/06/pattern-matching-in-c-part-6.aspx&lt;/A&gt;&lt;BR&gt;&lt;A href="http://community.bartdesmet.net/blogs/bart/archive/2008/04/06/pattern-matching-in-c-part-7.aspx"&gt;http://community.bartdesmet.net/blogs/bart/archive/2008/04/06/pattern-matching-in-c-part-7.aspx&lt;/A&gt;&lt;BR&gt;&lt;A href="http://community.bartdesmet.net/blogs/bart/archive/2008/04/06/pattern-matching-in-c-part-8.aspx"&gt;http://community.bartdesmet.net/blogs/bart/archive/2008/04/06/pattern-matching-in-c-part-8.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description></item><item><title>Απ: Pattern matching σε C#;</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/46084.aspx</link><pubDate>Fri, 07 Nov 2008 22:01:30 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:46084</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/46084.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=46084</wfw:commentRss><description>&lt;P&gt;Εγώ δεν θα γράψω διατριβή, απλά να υπενθυμίσω ότι στη "γιαγια" C++ χρησιμοποιούνται οι τεχνικές που δείχνει ο Άγγελος με templates για να επιτευχθεί το ίδιο αποτέλεσμα. Από το 1997 &lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-4.gif" alt="Stick out tongue" /&gt;. Αυτή είναι και η δύναμη των generics, η δημιουργία ευέλικτων και ισχυρών αλγόριθμων, όχι η δημιουργία ενός List&amp;lt;int&amp;gt;. Και αυτό είναι που χάνει η Java με την υλοποίηση των generics που έχει.&lt;/P&gt;
&lt;P&gt;Από την άλλη, μόνο όσοι ασχολούνται σοβαρά με την ανάπτυξη βιβλιοθηκών μπορούν να κάνουν καλό template/generic metaprogramming. Οι βιβλιοθήκες αυτές είναι εύκολες στη χρήση, αλλά δύσκολες στη δημιουργία. Γι αυτό και δεν έχουν φανεί ακόμα ακόμα κάποιες ευρέως αποδεκτές βιβλιοθήκες generics για .NET. Από την άλλη, ο Anders Hejlsberg προσθέτει functional δυνατότητες στη γλώσσα τόσο γρήγορα, που δεν προλαβαίνει κανείς να φτιάξει τις βιβλιοθήκες και θα είναι ήδη ξεπερασμένες!&lt;/P&gt;
&lt;P&gt;Η ουσία πάντως παραμένει ότι οι τεχνικές αυτές έρχονται από τη C++, έχουν ήδη μία ιστορία σχεδόν 10 ετών χρήσης μέσω του STL και του Boost, οπότε μπορούμε άνετα να τις αντιγράψουμε και να τις προσαρμόσουμε στις σημερινές γλώσσες.&lt;/P&gt;
&lt;P&gt;Immitation is the best form of flattery!&lt;/P&gt;</description></item><item><title>Απ: Pattern matching σε C#;</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/46082.aspx</link><pubDate>Fri, 07 Nov 2008 21:41:51 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:46082</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/46082.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=46082</wfw:commentRss><description>&lt;P&gt;Καλησπέρα φιλε Άγγελε, περιττό να&amp;nbsp;αναφέρω ότι χαίρομαι ιδιαιτερα που ασχολείσαι με F# και FP γενικότερα. Στα δικά μου C# projects χρησιμοποιώ αρκετά Pattern Matching και έχω υλοποιήσει κάτι που πιστεύω ότι θα το βρείς ενδιαφέρον... &lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Υλικά κατασκευής:&lt;/P&gt;
&lt;P&gt;Μια abstract class για την απαραίτητη αφαίρεση από την πραγματικότητα.&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;abstract&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;class&lt;/SPAN&gt; PatternMatch&amp;lt;TMatchValue, TResult&amp;gt;&lt;BR&gt;{&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;readonly&lt;/SPAN&gt; Predicate&amp;lt;TMatchValue&amp;gt; predicateFunc;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;readonly&lt;/SPAN&gt; Func&amp;lt;TMatchValue, TResult&amp;gt; resultFunc;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;readonly&lt;/SPAN&gt; PatternMatch&amp;lt;TMatchValue, TResult&amp;gt; linkPatternMatch;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/SPAN&gt; PatternMatch(Predicate&amp;lt;TMatchValue&amp;gt; predicateFunc, Func&amp;lt;TMatchValue, TResult&amp;gt; resultFunc)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;: &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;(predicateFunc, resultFunc, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;null&lt;/SPAN&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/SPAN&gt; PatternMatch(Predicate&amp;lt;TMatchValue&amp;gt; predicateFunc, Func&amp;lt;TMatchValue, TResult&amp;gt; resultFunc, PatternMatch&amp;lt;TMatchValue, TResult&amp;gt; linkPatternMatch)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&lt;/SPAN&gt; (predicateFunc == &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;null&lt;/SPAN&gt;) &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;throw&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;new&lt;/SPAN&gt; ArgumentNullException(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"predicateFunc"&lt;/SPAN&gt;);&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&lt;/SPAN&gt; (resultFunc == &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;null&lt;/SPAN&gt;) &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;throw&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;new&lt;/SPAN&gt; ArgumentNullException(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"resultFunc"&lt;/SPAN&gt;);&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this&lt;/SPAN&gt;.predicateFunc &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; predicateFunc;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this&lt;/SPAN&gt;.resultFunc &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; resultFunc;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this&lt;/SPAN&gt;.linkPatternMatch &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; linkPatternMatch;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/SPAN&gt; Predicate&amp;lt;TMatchValue&amp;gt; PredicateFunc { get { &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;return&lt;/SPAN&gt; predicateFunc; } }&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/SPAN&gt; Func&amp;lt;TMatchValue, TResult&amp;gt; ResultFunc { get { &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;return&lt;/SPAN&gt; resultFunc; } }&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region&lt;/SPAN&gt; Match&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/SPAN&gt; TResult Match(TMatchValue value)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach&lt;/SPAN&gt; (PatternMatch&amp;lt;TMatchValue, TResult&amp;gt; patternMatch &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;in&lt;/SPAN&gt; FromRootToBottom(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&lt;/SPAN&gt; (patternMatch.PredicateFunc(value))&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;/SPAN&gt; patternMatch.ResultFunc(value);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;new&lt;/SPAN&gt; MatchNotFoundException(String.Format(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"Incomplete pattern match, match value {0}"&lt;/SPAN&gt;, value));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&lt;/SPAN&gt; IEnumerable&amp;lt;PatternMatch&amp;lt;TMatchValue, TResult&amp;gt;&amp;gt; FromRootToBottom(PatternMatch&amp;lt;TMatchValue, TResult&amp;gt; patternMatch)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&lt;/SPAN&gt; (patternMatch.linkPatternMatch == &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;null&lt;/SPAN&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;yield &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;return&lt;/SPAN&gt; patternMatch;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;{&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach&lt;/SPAN&gt; (PatternMatch&amp;lt;TMatchValue, TResult&amp;gt; enumeratedPatternMatch &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;in&lt;/SPAN&gt; FromRootToBottom(patternMatch.linkPatternMatch))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;yield &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;return&lt;/SPAN&gt; enumeratedPatternMatch;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;yield &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;return&lt;/SPAN&gt; patternMatch;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/SPAN&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&lt;/SPAN&gt;&lt;BR&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;FONT face=Tahoma size=2&gt;Κάποιες απλές και ταπεινές concrete classes για τις διαφορες περιπτώσεις&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;class&lt;/SPAN&gt; WithPatternMatch&amp;lt;TMatchValue, TResult&amp;gt; : PatternMatch&amp;lt;TMatchValue, TResult&amp;gt;&lt;BR&gt;{&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/SPAN&gt; WithPatternMatch(Predicate&amp;lt;TMatchValue&amp;gt; predicateFunc, Func&amp;lt;TMatchValue, TResult&amp;gt; resultFunc)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;: &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt;(predicateFunc, resultFunc, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;null&lt;/SPAN&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/SPAN&gt; WithPatternMatch(Predicate&amp;lt;TMatchValue&amp;gt; predicateFunc, Func&amp;lt;TMatchValue, TResult&amp;gt; resultFunc, PatternMatch&amp;lt;TMatchValue, TResult&amp;gt; linkPatternMatch)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;: &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;base&lt;/SPAN&gt;(predicateFunc, resultFunc, linkPatternMatch)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;class&lt;/SPAN&gt; ElsePatternMatch&amp;lt;TMatchValue, TResult&amp;gt; : PatternMatch&amp;lt;TMatchValue, TResult&amp;gt;&lt;BR&gt;{&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/SPAN&gt; ElsePatternMatch(Func&amp;lt;TMatchValue, TResult&amp;gt; resultFunc, PatternMatch&amp;lt;TMatchValue, TResult&amp;gt; linkPatternMatch)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;: &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;base&lt;/SPAN&gt;(value =&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;true&lt;/SPAN&gt;, resultFunc, linkPatternMatch)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;}&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Tahoma&gt;Αλλη μια ταπεινή class για τα Incompete &lt;FONT size=1&gt;&lt;FONT size=1&gt;&lt;SPAN&gt;&lt;FONT size=2&gt;matches&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face=Tahoma&gt;&lt;FONT size=1&gt;&lt;FONT size=1&gt;&lt;SPAN&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;class&lt;/SPAN&gt; MatchNotFoundException : Exception&lt;BR&gt;{&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/SPAN&gt; MatchNotFoundException(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;string&lt;/SPAN&gt; message) : &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;base&lt;/SPAN&gt;(message) { }&lt;BR&gt;}&lt;/SPAN&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;FONT face=Tahoma size=2&gt;Και μια static class για bootstrap και&amp;nbsp;extension methods για fluent style&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;static&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;class&lt;/SPAN&gt; PatternMatch&lt;BR&gt;{&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region&lt;/SPAN&gt; With&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;static&lt;/SPAN&gt; WithPatternMatch&amp;lt;TMatchValue, TResult&amp;gt; With&amp;lt;TMatchValue, TResult&amp;gt;(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt; WithPatternMatch&amp;lt;TMatchValue, TResult&amp;gt; patternMatch, Predicate&amp;lt;TMatchValue&amp;gt; predicateFunc, Func&amp;lt;TMatchValue, TResult&amp;gt; resultFunc)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;new&lt;/SPAN&gt; WithPatternMatch&amp;lt;TMatchValue, TResult&amp;gt;(predicateFunc, resultFunc, patternMatch);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;static&lt;/SPAN&gt; WithPatternMatch&amp;lt;TMatchValue, TResult&amp;gt; With&amp;lt;TMatchValue, TResult&amp;gt;(Predicate&amp;lt;TMatchValue&amp;gt; predicateFunc, Func&amp;lt;TMatchValue, TResult&amp;gt; resultFunc)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;/SPAN&gt; With(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;null&lt;/SPAN&gt;, predicateFunc, resultFunc);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;static&lt;/SPAN&gt; WithPatternMatch&amp;lt;TMatchValue, TResult&amp;gt; With&amp;lt;TMatchValue, TResult&amp;gt;(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt; WithPatternMatch&amp;lt;TMatchValue, TResult&amp;gt; patternMatch, Predicate&amp;lt;TMatchValue&amp;gt; predicateFunc, Func&amp;lt;TResult&amp;gt; resultFunc)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;/SPAN&gt; With(patternMatch, predicateFunc, value =&amp;gt; resultFunc());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;static&lt;/SPAN&gt; WithPatternMatch&amp;lt;TMatchValue, TResult&amp;gt; With&amp;lt;TMatchValue, TResult&amp;gt;(Predicate&amp;lt;TMatchValue&amp;gt; predicateFunc, Func&amp;lt;TResult&amp;gt; resultFunc)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;/SPAN&gt; With(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;null&lt;/SPAN&gt;, predicateFunc, resultFunc);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region&lt;/SPAN&gt; Else&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;static&lt;/SPAN&gt; ElsePatternMatch&amp;lt;TMatchValue, TResult&amp;gt; Else&amp;lt;TMatchValue, TResult&amp;gt;(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt; WithPatternMatch&amp;lt;TMatchValue, TResult&amp;gt; patternMatch, Func&amp;lt;TMatchValue, TResult&amp;gt; resultFunc)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;new&lt;/SPAN&gt; ElsePatternMatch&amp;lt;TMatchValue, TResult&amp;gt;(resultFunc, patternMatch);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;static&lt;/SPAN&gt; ElsePatternMatch&amp;lt;TMatchValue, TResult&amp;gt; Else&amp;lt;TMatchValue, TResult&amp;gt;(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;this&lt;/SPAN&gt; WithPatternMatch&amp;lt;TMatchValue, TResult&amp;gt; patternMatch, Func&amp;lt;TResult&amp;gt;&amp;nbsp;resultFunc)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;/SPAN&gt; Else(patternMatch, value =&amp;gt; resultFunc());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&lt;/SPAN&gt;&lt;BR&gt;}&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;FONT face=Tahoma size=2&gt;Τα ανακατεύουμε καλά και ορίστε το αποτέλεσμα&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:black;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;var pattern &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;PatternMatch.With&amp;lt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;int&lt;/SPAN&gt;, &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;string&lt;/SPAN&gt;&amp;gt;(value =&amp;gt; value == 1, value =&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"One "&lt;/SPAN&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.With(value =&amp;gt; value == 2, value =&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"Two "&lt;/SPAN&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.With(value =&amp;gt; value == 3, value =&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"Three "&lt;/SPAN&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Else(() =&amp;gt; &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:#666666;FONT-FAMILY:Courier New;BACKGROUND-COLOR:#e4e4e4;"&gt;"Else"&lt;/SPAN&gt;);&lt;BR&gt;&lt;BR&gt;Console.WriteLine(pattern.Match(4));&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;</description></item><item><title>Pattern matching σε C#;</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/45934.aspx</link><pubDate>Mon, 03 Nov 2008 22:54:38 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:45934</guid><dc:creator>anjelinio</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/45934.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=45934</wfw:commentRss><description>Θυμάμαι απο πέρσι που άρχισα να κοιτάω κάτι γλώσσες σαν την F# και την Erlang, πόσο εντύπωση μου είχε κάνει η&lt;br&gt;ευκολία ενός χαρακτηριστικού τους, ονόματι pattern matching. &lt;br&gt;&lt;br&gt;Π.χ ... για να ορίσεις ένα enumeration στην F#, γράφεις κάτι σαν το παρακάτω:&lt;br&gt;&lt;br&gt;&lt;font size="2"&gt;&lt;font color="#00008b" size="2"&gt;&lt;font color="#00008b" size="2"&gt;type shape = Circle | Square | Triangle | EquilateralTriangle | Rectangle | Pentagon;;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;br&gt;Τώρα, σε περίπτωση που θες να εκτελέσεις κάτι διαφορετικό ανάλογα με την τιμή του shape, ένα switch statement δηλαδή, γράφεις &lt;br&gt;το εξής:&lt;br&gt;&lt;br&gt;&lt;font size="2"&gt;&lt;font color="#00008b" size="2"&gt;let numberOfSides(aShape:shape) = &lt;br&gt;match (aShape) with&lt;br&gt;| Circle -&amp;gt; 0&lt;br&gt;| Square -&amp;gt; 4&lt;br&gt;| EquilateralTriangle -&amp;gt; 3&lt;br&gt;| Triangle -&amp;gt; 3&lt;br&gt;| Rectangle -&amp;gt; 4&lt;br&gt;| Pentagon -&amp;gt; 5;;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;br&gt;Εδώ, match-άρει για σένα την τιμή, και εκτελεί το κατάλληλο lambda που του έχεις πεί. Δείτε όμως πόσο εύκολο και γρήγορο είναι το syntax. &lt;br&gt;&lt;br&gt;Στη C# ( και στη VB ? ) το switch είναι περιορισμένο σε συγκεκριμένους τύπους. Δε μπορείς δηλαδή εύκολα να βρείς αντίστοιχο syntax, και χάνεσαι&lt;br&gt;σε if-else και nesting κτλ κτλ και βράστα. &lt;br&gt;&lt;br&gt;Έψαχνα λοιπόν κάποιο τρόπο που θα μπορούσε να γίνει emulate αυτό το syntax σε C#, κι αν αξίζει τον κόπο και τέτοια. &lt;br&gt;Έφτασα λοιπόν στο παρακάτω αποτέλεσμα ... &lt;br&gt;&lt;br&gt;When&amp;lt;int&amp;gt; matchInt = new When&amp;lt;int&amp;gt;() { &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { (i) =&amp;gt; i == 0, (i) =&amp;gt; Console.WriteLine("zero: {0}", i) },&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { (i) =&amp;gt; i &amp;gt; 0, (i) =&amp;gt; Console.WriteLine("greater: {0}", i) },&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { (i) =&amp;gt; true, (i) =&amp;gt; Console.WriteLine("always on ...&amp;nbsp; {0}", i) }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br&gt;&lt;br&gt;&amp;nbsp;matchInt[8765]();&lt;br&gt;&lt;br&gt;Η κλάσση When, είναι απλώς subclass του Dictionary&amp;lt;Predicate&amp;lt;T&amp;gt;, Action&amp;lt;T&amp;gt;&amp;gt; για το ευκολότερο syntax. Κατα τ'άλλα, έχει ένα indexer ακόμα, ο οποίος επιστρέφει - προσοχή τώρα :D - ένα function, το οποιο θα τρέξει όλα τα κλειδιά στο dictionary - τα οποία είναι functions που επιστρέφουν true/false - και αν πάρει πίσω true, θα τρέξει και το Αction&amp;lt;Τ&amp;gt; που έχει για value ...&amp;nbsp; μπερδευτικό;&amp;nbsp; Είναι το foreach στη μέθοδο Do, διαβάζεται πιο εύκολα απο ότι περιγράφεται ...&lt;br&gt;&lt;br&gt;class When&amp;lt;TValueType&amp;gt; : Dictionary&amp;lt;Predicate&amp;lt;TValueType&amp;gt;, Action&amp;lt;TValueType&amp;gt;&amp;gt; {&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual void Do(TValueType input) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (Predicate&amp;lt;TValueType&amp;gt; predicate in this.Keys.Where((p) =&amp;gt; null != this[p]))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (predicate(input))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this[predicate](input);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Action this[TValueType input] {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return () =&amp;gt; Do(input);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&lt;br&gt;Όλα αυτά λοιπόν, για να μπορείς να γράψεις ένα&amp;nbsp; matchInt[123]();&amp;nbsp; ...&amp;nbsp; Τί κέρδισα τελικά;&lt;br&gt;&lt;br&gt;Νομίζω ότι είναι σημαντικό αυτό που δε φαίνεται. Μέσα σε ένα απλό dictionary, έχω αποθηκεύσει τρόπον τινά τις μεθόδους οι οποίες κάνουν validate ένα οποιοδήποτε object. Απο τη στιγμή που έχω πεί Action&amp;lt;int&amp;gt; validateOne = matchInt[1]; έχω ένα function το οποιο θα κάνει validate το 1, ή ένα οποιοδήποτε by ref type, και θα εκτελέσει conditional λογική. &lt;br&gt;&lt;br&gt;Αυτή τη μέθοδο μπορώ να την καλέσω τώρα, ή να την αποθηκεύσω σε ένα variable για να τη χρησιμοποιήσω μετά, και λίγο αργότερα και ξανά και ξανά. Κι είναι μόνο ένα variable :] ... δεν παίρνει καν παραμέτρους :D&lt;br&gt;&lt;br&gt;Και κάπου εδώ, αρχίζει η φαντασία. Αν μπορείς να κάνεις serialize αυτά τα "if-then", τότε έχεις ένα μίνι rules framework. Βάζοντας απο πάνω και μια μίνιμαλ βιβλιοθήκη απο βασικά structures - setProperty, getProperty, BelongsToRegion, whatever ..&amp;nbsp; - τότε έχεις δώσει ένα μικρό vocabulary στη "χρήστη", με το οποίο μπορεί να σχεδιάζει interactions και rules πολύ εύκολα. &lt;br&gt;&lt;br&gt;Ήδη σκεφτομαι πώς θα μπορούσα να το χρησιμοποιήσω για να κάνω display/hide/disable/validate controls σε μια ASP.NET σελίδα. &lt;br&gt;&amp;nbsp;&lt;br&gt;... κι αν μπορούσα απο το ίδιο xml να τα κάνω deserialize και σε javascript;&lt;br&gt;... αλλά εδώ πλέον αρχίζει πραγματική επιστημονική φαντασία :D&lt;br&gt; &amp;nbsp;&lt;br&gt;Καλό μας απόγευμα !&amp;nbsp; &lt;br&gt;&lt;br&gt;&lt;br&gt;</description></item></channel></rss>