<?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>Πρώτα Βήματα - Γλώσσες προγραμματισμού</title><link>https://www.dotnetzone.gr:443/cs/forums/74/ShowForum.aspx</link><description>Τα πρώτα βήματα στις γλώσσες VB6, VB.NET, και C#</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Yield to my power !!!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/35967.aspx</link><pubDate>Mon, 08 Oct 2007 21:25:40 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:35967</guid><dc:creator>anjelinio</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/35967.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=74&amp;PostID=35967</wfw:commentRss><description>Σαφώς  &lt;br&gt;</description></item><item><title>Απ: Yield to my power !!!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/35966.aspx</link><pubDate>Mon, 08 Oct 2007 21:10:15 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:35966</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/35966.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=74&amp;PostID=35966</wfw:commentRss><description>&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;FONT size=1&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;Καλησπέρα φιλε Άγγελε,&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;Μια χαρά το παράδειγμα που έδωσες... απλά μια μικρή αλλαγή...&lt;/FONT&gt;&lt;/P&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;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;static&lt;/SPAN&gt; IEnumerable&amp;lt;&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; ScanFolderTree(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;string&lt;/SPAN&gt; basePath) &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;string&lt;/SPAN&gt;[] fileNames &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:red;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;=&lt;/SPAN&gt; Directory.GetFiles(basePath);&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// First return each of the files ...&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;foreach&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; fileName &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;in&lt;/SPAN&gt; fileNames)&lt;BR&gt;&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; fileName;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:green;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// then the subfolder files .. recursively !!! :D :D :D&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;foreach&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; folderName &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;in&lt;/SPAN&gt; Directory.GetDirectories(basePath))&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;(&lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;string&lt;/SPAN&gt; subFolderFile &lt;SPAN style="FONT-WEIGHT:normal;FONT-SIZE:11px;COLOR:blue;FONT-FAMILY:Courier New;BACKGROUND-COLOR:transparent;"&gt;in&lt;/SPAN&gt; ScanFolderTree(folderName))&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; subFolderFile; &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=2&gt;&lt;FONT size=2&gt;
&lt;P&gt;Νομίζω... ότι τώρα είναι "λιγάκι" πιο καθαρό&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;</description></item><item><title>Yield to my power !!!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/35964.aspx</link><pubDate>Mon, 08 Oct 2007 20:32:10 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:35964</guid><dc:creator>anjelinio</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/35964.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=74&amp;PostID=35964</wfw:commentRss><description>Καιρό τώρα, καθώς περνάμε αργά αλλά σταθερά απο 1.1 σε ... 3.5 ( &lt;i&gt;culture shock το λένε αυτό ...&lt;/i&gt; ), πολύς κόσμος κολλάει στο ... yield. &lt;br&gt;&lt;br&gt;"&lt;i&gt;Τυπικά&lt;/i&gt;", το yield είναι ένα keyword που παίζει απο καιρό, και "&lt;i&gt;παραδίδει τον έλεγχο του execution flow στον caller&lt;/i&gt;". &lt;br&gt;&lt;br&gt;Προσπαθούσα λοιπόν να το εξηγήσω αυτό στα μικράκια μας, και έψαχνα ένα καλό παράδειγμα. Και νομίζω ότι την Παρασκευή .. το βρήκα:&lt;br&gt;



















&lt;p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"&gt;&lt;span style="font-size:8pt;font-family:'Courier New';color:gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;/span&gt;&lt;span style="font-size:8pt;font-family:'Courier New';color:green;"&gt; &lt;/span&gt;&lt;span style="font-size:8pt;font-family:'Courier New';"&gt;&amp;lt;summary&amp;gt;&lt;br&gt;&lt;span&gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;/span&gt;&lt;span&gt; Will recursively scan a
folder and all it's subfolders, returning all the contained files&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; in a single IEnumerator&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span style="color:green;"&gt; ...&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;param name="basePath"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:8pt;font-family:'Courier New';"&gt;&lt;span&gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span&gt;IEnumerator&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; ScanFolderTree(&lt;span style="color:blue;"&gt;string&lt;/span&gt;
basePath) {&lt;br&gt;&lt;span&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;[] fileNames = &lt;span&gt;Directory&lt;/span&gt;.GetFiles(basePath);&lt;br&gt;&lt;span&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;// First return each of the files ...&lt;br&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;string&lt;/span&gt;
fileName &lt;span style="color:blue;"&gt;in&lt;/span&gt; fileNames)&lt;br&gt;&lt;span&gt;4&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;/span&gt;&lt;span style="color:blue;"&gt;yield&lt;/span&gt; &lt;span style="color:blue;"&gt;return&lt;/span&gt;
fileName;&lt;/span&gt;&lt;/p&gt;













&lt;p class="MsoNormal" style="margin-bottom:0.0001pt;line-height:normal;"&gt;&lt;span style="font-size:8pt;font-family:'Courier New';"&gt;&lt;span&gt;5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;// then the subfolder files .. recursively !!! :D :D :D&lt;br&gt;6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;string&lt;/span&gt;
folderName &lt;span style="color:blue;"&gt;in&lt;/span&gt; &lt;span&gt;Directory&lt;/span&gt;.GetDirectories(basePath))
{&lt;br&gt;&lt;span&gt;7&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;/span&gt;&lt;span&gt;IEnumerator&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;
subFolderFiles = ScanFolderTree(folderName);&lt;br&gt;&lt;span&gt;8&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;/span&gt;&lt;span style="color:blue;"&gt;while&lt;/span&gt;(subFolderFiles.MoveNext())&lt;br&gt;&lt;span&gt;9&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; &lt;/span&gt;&lt;span style="color:blue;"&gt;yield&lt;/span&gt; &lt;span style="color:blue;"&gt;return&lt;/span&gt;
subFolderFiles.Current;&lt;br&gt;&lt;span&gt;10 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:8pt;font-family:'Courier New';"&gt;}&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;



&lt;p class="MsoNormal"&gt;&lt;span style="font-size:8pt;line-height:115%;font-family:'Courier New';"&gt;&lt;span&gt;11 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;yield&lt;/span&gt;
&lt;span style="color:blue;"&gt;break&lt;/span&gt;;&lt;br&gt;&lt;span&gt;12 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;

Η μικρή "&lt;i&gt;απάτη&lt;/i&gt;" παραπάνω, γυρίζει ένα IEnumerator&amp;lt;string&amp;gt; που περιέχει όλα τα files που υπάρχουν σε ένα folder tree. Υπο κανονικές συνθήκες, χωρίς το yield keyword, αυτό δε θα μπορούσε να γίνει εύκολα. &lt;br&gt;&lt;br&gt;Η ... μαγεία αρχίζει στη γραμμή 4. Όσο το string[] έχει ακόμη items, κάθε yield θα γυρίζει το επόμενο item απο το array. Η "μαγκιά" τώρα με το yield. Όταν αυτό το foreach τελειώσει, η εκτέλεση θα συνεχίσει στην επόμενη γραμμή !&lt;br&gt;&lt;br&gt;Συνεχίζω λοιπόν, και παίρνω και τα folder names κάτω απο το basePath. Κι εδώ παίζει πλέον στην γραμμή 7 η recursive&amp;nbsp; - &lt;i&gt;δε μπορώ να γράψω τη λέξη που σκέφτομαι &lt;/i&gt;- "μαγκιά" του όλου θέματος, και καλώ τη μέθοδο, με basePath, το εκάστοτε subFolder μου. &lt;br&gt;&lt;br&gt;Προσοχή τώρα ... εφ' όσον αυτό είναι recursive, και με παράμετρο το subFolder, θα γίνει το ίδιο πράγμα. Θα κάνει enumerate τα αρχεία, και μετά με τη σειρά του recursively και τα δικά του sub-folders &lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-5.gif" alt="Wink" /&gt;&lt;br&gt;&lt;br&gt;Έχοντας λοιπόν έναν IEnumerator&amp;lt;string&amp;gt; ως αποτέλεσμα του recursive call, μπορώ στις γραμμές 8-9 να τον κάνω enumerate, και να επιστρέφω ένα ένα τα αρχεία που μου επιστρέφει&amp;nbsp; ( μοιάζει με Tree traversal, εκεί που περνας απο όλα τα leaf nodes με ένα συγκεκριμένο τρόπο; ).&lt;br&gt;&lt;br&gt;Και τέλος λές κι ένα yield brake, για να σταματήσει κάποτε όλη αυτή η ιστορία - &lt;i&gt;αλλιώς θα γυρίζει null για πάντα μόλις τελειώσουν όλα τα αρχεία !!! &lt;/i&gt;&lt;br&gt;&lt;br&gt;Όλα λοιπόν αυτά τα "μαγικά" δε θα μπορούσαν να γίνουν, χωρίς το yield keyword, το οποίο "&lt;i&gt;παραδίδει τον έλεγχο του execution flow στον caller&lt;/i&gt;" και σου επιτρέπει να συνεχίσεις μετά στις γραμμές παρακάτω &lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;br&gt;&lt;br&gt;&lt;i&gt;Yield to it's power λοιπόν, και χρησιμοποιείστε το. Ανοίγει πόρτες μέχρι τώρα κλειστές μόλις το "πιάσεις" ... &lt;/i&gt;&lt;br&gt;&lt;br&gt;Καλό μας απόγευμα ...&lt;br&gt;</description></item></channel></rss>