690 likes | 845 Views
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.
E N D
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 • Einführung • Interfaces – der Collections • Collections – Klassen im Framework • Collections – selbstgemacht • Sortieren – im Framework • Alternativen • Zusammenfassung
Einführung Für Jäger und Sammler
Die gute alte Zeit ........ • VB 6 • Arrays • VB - Collection • Scripting Runtime • Dictionary
.......und Heute ? Array System.Array Collection Dictionary System.Collections... Microsoft.VisualBasic.Collection
Collection – Klassen in .Net • Eine Menge von Klassen, die verschiedene Interfaces implementieren • Namespaces • System.Collections • System.Collections.Specialized • Microsoft.VisualBasic.Collection
Interfaces Was müssen Collections bieten?
Interfaces Übersicht • IEnumerable, IEnumerator • ICollection • IList • IDictionary • IComparable • IComparer IEnumerable • For Each Support ICollection • Count, CopyTo IList IDictionary • Index • Key
Interfaces I • IEnumerable • For Each Support • GetEnumerator() • ICollection InheritsIEnumerable • Abzählen, Synchronisation, in Array kopieren • CopyTo(), Count, IsSynchronized, SyncRoot
Interfaces II • IList Inherits ICollection, IEnumerable • Menge von Elementen, • Zugriff über Index • IsReadOnly, IsFixedSize • Add( ), Insert( ) • Contains(), IndexOf() • Clear( ), Remove( ), RemoveAt( )
Interfaces III • IDictionary Inherits ICollection, IEnumerable • Enthält DictionaryEntry – Elemente • Zugriff über Schlüssel • IsFixedSize, IsReadOnly • Keys, Values • Add( ), Remove( ) • Clear( ), Contains( )
Interfaces IV • IComparable, IComparer • Sortieren von Objekten • Später....
Collections Wir schreiten zur Tat...
Übersicht Collections • 0 - basiert • Viele haben: • Constructor der ICollection akzeptiert • AddRange, RemoveRange • DataSource • Indexer • VB: myObj = Col.Item( 7 ) • C#: myObj = Col [ 7 ]
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
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;}
ArrayList I • Eindimensionales Array • Kann wachsen und schrumpfen • Capacity,TrimToSize • Add,AddRange,Insert,InsertRange • Remove,RemoveAt,RemoveRange • Kann Elemente sortieren, suchen • Zugriff über Index
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
HashTable • Properties • Count • Keys, Values • Methoden • Add, Remove • ContainsKey, ContainsValue • Standard IDictionary Implementierung • Keine Sortierung
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
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); }
HashTable • Einsatz: • Viele Objekte • Zufällige / ungeordnete Zugriffe • Zugriff über eindeutigen Key • Langsamer als ArrayList
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
HybridDictionary • Verwaltet kleine Mengen in ListDictionary • Wechselt automatisch zu Hashtable wenn Collection zu groß wird • System.Collections.Specialized
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
SortedList • Properties • Item (Index / Key) • Capacity • Keys, Values • Methoden • Add, Remove, RemoveAt • ContainsKey, ContainsValue • IndexOfKey, IndexOfValue
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()
VisualBasic.Collection • Kompatibilitätsgründe • Langsamer als ArrayList und Hashtable
String Dictionary / Collection • System.Collections.Specialized • StringCollection • Collection für Strings • StringDictionary • Hashtable für Strings
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
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)
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.
Collections – selbstgemacht So schmeckt es immer noch am besten!
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
CollectionBase • ArrayList für eigene typisierte Collections • Über InnerList Property Zugriff auf ArrayList Member • Zugriff über Index
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"; }
DictionaryBase • Hashtable für eigene typisierte Collections • InnerHashtable • Zugriff über Key
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];} } }
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); }
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
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);} }
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
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); } }
IEnumerator • IEnumerable.GetEnumerator • muß Enumerator zurückgeben • Kann selbst implementiert werden • Nur in besonderen Anwendungsgebieten • Reihenfolge bei foreach verändern .... • .........
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
Sortieren im Framework Auf die Reihenfolge kommt es an!
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