1 / 69

Datenstrukturen

Datenstrukturen. Das Framework der Jäger und Sammler. Marcel Gnoth, NTeam GmbH. No. 239. Zur Person. Dipl. Inf. Marcel Gnoth, MCSD www.gnoth.net NTeam GmbH, Berlin www.nteam.de Senior Consultant, Trainer VB6, COM, Datenbanken Verteilte Informationssysteme Und .... . Net. Inhalt.

ida
Download Presentation

Datenstrukturen

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Datenstrukturen Das Framework der Jäger und Sammler Marcel Gnoth, NTeam GmbH No. 239

  2. Zur Person • Dipl. Inf. Marcel Gnoth, MCSD • www.gnoth.net • NTeam GmbH, Berlin • www.nteam.de • Senior Consultant, Trainer • VB6, COM, Datenbanken • Verteilte Informationssysteme • Und .....Net

  3. Inhalt • Einführung • Interfaces – der Collections • Collections – Klassen im Framework • Collections – selbstgemacht • Sortieren – im Framework • Alternativen • Zusammenfassung

  4. Einführung Für Jäger und Sammler

  5. Die gute alte Zeit ........ • VB 6 • Arrays • VB - Collection • Scripting Runtime • Dictionary

  6. .......und Heute ? Array System.Array Collection Dictionary System.Collections... Microsoft.VisualBasic.Collection

  7. Collection – Klassen in .Net • Eine Menge von Klassen, die verschiedene Interfaces implementieren • Namespaces • System.Collections • System.Collections.Specialized • Microsoft.VisualBasic.Collection

  8. Interfaces Was müssen Collections bieten?

  9. Interfaces Übersicht • IEnumerable, IEnumerator • ICollection • IList • IDictionary • IComparable • IComparer IEnumerable • For Each Support ICollection • Count, CopyTo IList IDictionary • Index • Key

  10. Interfaces I • IEnumerable • For Each Support • GetEnumerator() • ICollection InheritsIEnumerable • Abzählen, Synchronisation, in Array kopieren • CopyTo(), Count, IsSynchronized, SyncRoot

  11. Interfaces II • IList Inherits ICollection, IEnumerable • Menge von Elementen, • Zugriff über Index • IsReadOnly, IsFixedSize • Add( ), Insert( ) • Contains(), IndexOf() • Clear( ), Remove( ), RemoveAt( )

  12. Interfaces III • IDictionary Inherits ICollection, IEnumerable • Enthält DictionaryEntry – Elemente • Zugriff über Schlüssel • IsFixedSize, IsReadOnly • Keys, Values • Add( ), Remove( ) • Clear( ), Contains( )

  13. Interfaces IV • IComparable, IComparer • Sortieren von Objekten • Später....

  14. Collections Wir schreiten zur Tat...

  15. Übersicht Collections • 0 - basiert • Viele haben: • Constructor der ICollection akzeptiert • AddRange, RemoveRange • DataSource • Indexer • VB: myObj = Col.Item( 7 ) • C#: myObj = Col [ 7 ]

  16. Übersicht I – Klassisch

  17. Übersicht II – Die Exoten

  18. Array • System.Array • Rank: Anzahl der Dimensionen • Length: Anzahl Elemente absolut • GetLength(n): Anzahl Elemente einer Dimension • Clone, Reverse • Kann Inhalt sortieren • Binäre Suche auf sortierten Elementen • Größe kann nicht verändert werden • Implementiert IList

  19. Array • Erzeugen... • VB • C# • foreach (C#) Dim row()As Integer = {0,1,2,3} Dim row(4)As Integer long[]row = {0,1,2,3}; long[]row = new long[4]; long[]row = new long[]{0,1,2,3}; foreach (int ID in colArr){ ID=4;}

  20. ArrayList I • Eindimensionales Array • Kann wachsen und schrumpfen • Capacity,TrimToSize • Add,AddRange,Insert,InsertRange • Remove,RemoveAt,RemoveRange • Kann Elemente sortieren, suchen • Zugriff über Index

  21. ArrayList II • ArrayList.Adapter generiert Wrapper für IList Objekte • Nutzen der ArrayList Methoden • Einsatz: • Schnell, effizient, nur Index • So oft wie möglich DemoArrayList.Adapter

  22. HashTable • Properties • Count • Keys, Values • Methoden • Add, Remove • ContainsKey, ContainsValue • Standard IDictionary Implementierung • Keine Sortierung

  23. Hashtable • Hashcode • Für jeden Eintrag wird Hashcode berechnet • Anhand des Hashcodes werden Objekte einsortiert • Elemente sind nicht in Reihenfolge ihres Einfügens angeordnet • Durch Hashcode schnelles Suchen

  24. Hashtable • DictionaryEntry • Values foreach (DictionaryEntry e in colDic) { Console.Write("{0}/{1} ", e.Key,e.Value); } foreach (CCustomer c in colCustDB.Values){ Console.Write(c.Caption); }

  25. HashTable • Einsatz: • Viele Objekte • Zufällige / ungeordnete Zugriffe • Zugriff über eindeutigen Key • Langsamer als ArrayList

  26. ListDictionary • Einfache Implementierung von IDictionary • verkettete Liste • Wenig Overhead • Empfohlen für kleine Collections (<11) • Sehr langsam bei Count > 1000 • Hashtable benutzen!! • System.Collections.Specialized

  27. HybridDictionary • Verwaltet kleine Mengen in ListDictionary • Wechselt automatisch zu Hashtable wenn Collection zu groß wird • System.Collections.Specialized

  28. SortedList • Kreuzung aus Hashtable und Array • IList und IDictionary • Sortiert nach den Keys • Zugriff über Key und Index • Intern zwei Arrays für Keys und Values • Bisschen langsamer als Hashtable • Sehr vielseitig

  29. SortedList • Properties • Item (Index / Key) • Capacity • Keys, Values • Methoden • Add, Remove, RemoveAt • ContainsKey, ContainsValue • IndexOfKey, IndexOfValue

  30. VisualBasic.Collection • In C# Referenz auf „Microsoft.VisualBasic“ setzen • In VB: • Verhält sich wie die gute alte VB Collection • Zugriff über Index oder Key • Achtung !!! 1 – basiert !!! private Microsoft.VisualBasic.Collection colVB; Dim colVB As Collection = New Collection()

  31. VisualBasic.Collection • Kompatibilitätsgründe • Langsamer als ArrayList und Hashtable

  32. String Dictionary / Collection • System.Collections.Specialized • StringCollection • Collection für Strings • StringDictionary • Hashtable für Strings

  33. Queue / Stack • Queue • First In First Out • Enqueue( ) / Dequeue( ) • Stack • Last In First Out • Push( ), Pop( ) • Gemeinsame Eigenschaften / Methoden • Peek( ), Contains( ) • ToArray( ), Count • Können mit foreach durchlaufen werden

  34. BitArray / BitVektor • Verwalten Bitfelder • BitVektor • Struktur, auf dem Stack (Wert-Typ) • 32 Bits • Effizienter als BitArray • Logische Operationen auf den Bits Dim myBA2 As New BitArray(5, False) Dim myBytes() As Byte = {1, 2, 3, 4, 5} Dim myBA3 As New BitArray(myBytes) Dim myBools() As Boolean = {True, False, True, True, True} Dim myBA4 As New BitArray(myBools)

  35. NameValueCollection • Keys und Values sind Strings • Zugriff über Key oder Index • Mehrere Values können den gleichen Key haben • Key nicht eindeutig! • Gruppiert nach Keys foreach (string k in nv.AllKeys) Debug.WriteLine(k + ": " + nv[k]); Key1: Anna,Barbara,Claudia Key2: Doris,Erna Key3: Frida,Gabi,Helga,Inga Key4: Karla DemoNameValueCol.

  36. Collections – selbstgemacht So schmeckt es immer noch am besten!

  37. Eigene Collection-Klassen • Abstrakte Klassen im Framework • ReadOnlyCollectionBase • CollectionBase • DictionaryBase • NameObjectCollectionBase • Eigene Klassen davon ableiten (Vererbung) • Keine Aggregation mehr wie in VB6 • oder alles selber machen

  38. CollectionBase • ArrayList für eigene typisierte Collections • Über InnerList Property Zugriff auf ArrayList Member • Zugriff über Index

  39. CollectionBase Implementierung public class CCustomersColBase: CollectionBase { //Konstruktor der Basisklasse aufrufen public CCustomersColBase() : base() { } public void Add(CCustomer Cu) { this.InnerList.Add(Cu); } public void Remove(int x){ this.InnerList.RemoveAt(x); } public CCustomer this[int x] { //Indexer get {return (CCustomer) InnerList[x];} } } foreach (CCustomer cu in colCustCB){ cu.Caption = "Hallo"; }

  40. DictionaryBase • Hashtable für eigene typisierte Collections • InnerHashtable • Zugriff über Key

  41. DictionaryBase Implementierung public class CCustomersDicBase: DictionaryBase { //Konstruktor der Basisklasse aufrufen public CCustomersDicBase() : base() { } public void Add(CCustomer Cu, string k){ this.InnerHashtable.Add(k,Cu); } public void Remove(string Key){ InnerHashtable.Remove(Key); } //Support für spezielles foreach public System.Collections.ICollection Values { get {return this.InnerHashtable.Values;} } //Indexer public CCustomer this[string Key] { get {return (CCustomer) InnerHashtable[Key];} } }

  42. DictionaryBase Zugriff • DictionaryEntry • ICollection Values foreach (DictionaryEntry d in colCustDB){ Console.Write (d.Key + d.Value); } foreach (CCustomer c in colCustDB.Values){ Console.Write (c.Caption); }

  43. NameObjectCollectionBase DemoNameObjColBase • Intern eine Hashtable • Zugriff über Index oder Key • Gruppiert nach Keys • Keys sind Strings • Keys können mehrfach vorkommen • Haben mehrere Objekte den gleichen Key, dann bei Zugriff über Key nur das erste Objekt • Über Index Zugriff auf alle Objekte

  44. Indexer in C# public CCustomer this[string Key] { get {return (CCustomer) this.BaseGet(Key);} } public CCustomer this[int Index] { get {return (CCustomer) this.BaseGet(Index);} }

  45. Indexer in VB.Net Public ReadOnly Property Item(ByVal Index As Integer) _ As CCustomer Get Return CType(Me.InnerList(DBID), CCustomer) End Get End Property Public ReadOnly Property Item(ByVal Key As String) _ As CCustomer Get Return CType(Me.InnerHashtable(Key), CCustomer) End Get End Property

  46. Collection – selbstgemacht • Eigene Collection-Klasse definieren • muß Interfaces implementieren • Mindestens IEnumerable public class Tokens : IEnumerable{ private string[] elements; public Tokens(string source, char[] delim){ elements = source.Split(delimiters); } public IEnumerator GetEnumerator() { return new TokenEnumerator(this); } }

  47. IEnumerator • IEnumerable.GetEnumerator • muß Enumerator zurückgeben • Kann selbst implementiert werden • Nur in besonderen Anwendungsgebieten • Reihenfolge bei foreach verändern .... • .........

  48. IEnumerator - Beispiel private class TokenEnumerator : IEnumerator { private int position = -1; private Tokens t; public TokenEnumerator(Tokens t) { this.t = t; } public bool MoveNext() { if (position < t.elements.Length - 1) { position++; return true;} else {return false;} } public void Reset() { position = -1; } public object Current { get {return t.elements[position];} } } DemoTokens-Collection

  49. Sortieren im Framework Auf die Reihenfolge kommt es an!

  50. Sortieren • Array, ArrayList und andere können Objekte sortieren • Entweder... • die Objekte implementieren selbst Interface IComparable • ...oder... • Extra Klassen für ein Objekt, die IComparer implementieren • Immer wenn es im Framework etwas zu sortieren gibt, werden diese Interfaces benutzt

More Related