{"id":3274,"date":"2020-10-20T19:12:06","date_gmt":"2020-10-20T17:12:06","guid":{"rendered":"http:\/\/www.capri-soft.de\/blog\/?p=3274"},"modified":"2020-10-20T19:15:27","modified_gmt":"2020-10-20T17:15:27","slug":"c-net-custom-collections-anstelle-von-list-erstellen-ueber-die-mit-foreach-iteriert-werden-kann","status":"publish","type":"post","link":"https:\/\/www.capri-soft.de\/blog\/?p=3274","title":{"rendered":"C#.NET : Custom Collections anstelle von List<T> erstellen \u00fcber die mit foreach( &#8230; ) iteriert werden kann"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Intention<\/h2>\n\n\n\n<p>Um die Klasse List&lt;T&gt; vor Zugriffen zu sch\u00fctzen \/ zu beschr\u00e4nken oder diese mit Notification-Events (z.B. ObservableCollection) auszustatten werden f\u00fcr den jeweiligen Verwendungszweck  eigene Collections verwendet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ansatz<\/h2>\n\n\n\n<p>Um eine eigene Collection zu erstellen, welche mit foreach( &#8230; ) \u00fcber die Elemente der eingekapselten Struktur (also z.B. List&lt;T&gt;) zu iterieren, ben\u00f6tigt man eine Enumerator-Klasse, welche die Methoden &#8230;<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>MoveNext()<\/li><li>Reset()<\/li><li>&#8230; und die Property &#8222;Current&#8220; implementiert<\/li><\/ul>\n\n\n\n<p>implementiert (hier MyCollectionEnumerator)  &#8230; sowie nat\u00fcrlich die gecustomizte Collection-Klasse selber, die die Datenstruktur enth\u00e4lt (hier MyCollection).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">L\u00f6sung<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nusing System;\nusing System.Collections.Generic;\n\nnamespace Irrsinn\n{\n    \/\/ Diese Klasse definiert mit MoveNext \/ Reset und der Property\n    \/\/ Current aus dem Interface IEnumerator wie foreach(String s in col)\n    \/\/ \u00fcber die eingekapselte Liste iterieren darf.\n    public class MyCollectionEnumerator : System.Collections.IEnumerator\n    {\n        private List&lt;string&gt; StringList;\n        private int Counter = -1;\n\n        \/\/ Im Konstruktor wird die Liste \u00fcbergeben um die Operationen\n        \/\/ MoveNext \/ Reset \/ Current darauf ausf\u00fchren zu k\u00f6nnen\n        public MyCollectionEnumerator(List&lt;string&gt; _StringList)\n        {\n            this.StringList = _StringList;\n        }\n\n        \/\/ Geht auf den n\u00e4chsten Datensatz, der in der Liste \n        \/\/ gespeichert ist. Wenn MoveNext() false zur\u00fcckgibt\n        \/\/ ist das Ende der Liste erreicht\n        public bool MoveNext()\n        {\n            Counter++;\n            return Counter &lt; StringList.Count;\n        }\n\n        \/\/ Setzt die Collection zur\u00fcck.\n        public void Reset()\n        {\n            Console.WriteLine(&quot;RESET!&quot;);\n            Counter = -1;\n        }\n\n        \/\/ Gibt immer das aktuelle Element zur\u00fcck, was mit \n        \/\/ MoveNext erreicht wurde\n        public object Current\n        {\n            get\n            {\n                return StringList&#x5B;Counter];\n            }\n        }\n    }\n\n    public class MyCollection\n    {\n        \/\/ Intern ist sind Collections meistens vom Typ List&lt;T&gt;\n        \/\/ aber die eigene Implementierung gibt uns die M\u00f6glichkeit\n        \/\/ den Zugriff auf die Liste anzupassen.\n        private List&lt;string&gt; _StringList = new List&lt;string&gt;();\n\n        \/\/ Hinzuf\u00fcgen eines Strings\n        public void AddString(string newString)\n        {\n            this._StringList.Add(newString);\n        }\n\n        \/\/ GetEnumerator wird ben\u00f6tigt um mit foreach(...)\n        \/\/ \u00fcber die Collection zu iterieren\n        public System.Collections.IEnumerator GetEnumerator()\n        {\n            return new MyCollectionEnumerator(_StringList);\n        }\n    }\n\n    class Program\n    {\n        static void Main(string&#x5B;] args)\n        {\n            \/\/ Gecustomizte Collection\n            MyCollection myCol = new MyCollection();\n            myCol.AddString(&quot;Schatzi schenk mir ein Foto&quot;);\n            myCol.AddString(&quot;schenk mir ein Foto vom Bier&quot;);\n            myCol.AddString(&quot;Schatzi schenk mir ein Foto&quot;);\n            myCol.AddString(&quot;Dann schenk ich Dir auch eins&quot;);\n            myCol.AddString(&quot;vom Tier (also von den Muppets)&quot;);\n\n\n            foreach (string s in myCol)\n            {\n                Console.WriteLine(s);\n            }\n\n            Console.ReadLine();\n        }\n    }\n}\n<\/pre><\/div>\n\n\n<iframe loading=\"lazy\" width=\"100%\" height=\"475\" src=\"https:\/\/dotnetfiddle.net\/Widget\/CNXQ7W\" frameborder=\"0\"><\/iframe>\n<iframe src=\"http:\/\/www.facebook.com\/plugins\/like.php?href=https%3A%2F%2Fwww.capri-soft.de%2Fblog%2F%3Fp%3D3274&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light\" scrolling=\"no\" frameborder=\"0\" allowTransparency=\"true\" style=\"border:none; overflow:hidden; width:450px;margin-top:5px;\"><\/iframe>","protected":false},"excerpt":{"rendered":"<p>Intention Um die Klasse List&lt;T&gt; vor Zugriffen zu sch\u00fctzen \/ zu beschr\u00e4nken oder diese mit Notification-Events (z.B. ObservableCollection) auszustatten werden f\u00fcr den jeweiligen Verwendungszweck eigene Collections verwendet. Ansatz Um eine eigene Collection zu erstellen, welche mit foreach( &#8230; ) \u00fcber die Elemente der eingekapselten Struktur (also z.B. List&lt;T&gt;) zu iterieren, ben\u00f6tigt man eine Enumerator-Klasse, welche &hellip; <a href=\"https:\/\/www.capri-soft.de\/blog\/?p=3274\" class=\"more-link\"><span class=\"screen-reader-text\">C#.NET : Custom Collections anstelle von List<T> erstellen \u00fcber die mit foreach( &#8230; ) iteriert werden kann<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[4,33,3],"tags":[137,106,136],"class_list":["post-3274","post","type-post","status-publish","format-standard","hentry","category-net","category-c","category-programmierung","tag-collection-vs-list","tag-collections","tag-custom-collection"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p4yGeN-QO","jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/3274","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3274"}],"version-history":[{"count":2,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/3274\/revisions"}],"predecessor-version":[{"id":3276,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/3274\/revisions\/3276"}],"wp:attachment":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3274"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3274"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3274"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}