Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

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

Ähnliche Präsentationen


Präsentation zum Thema: "No. 239 Marcel Gnoth, NTeam GmbH Datenstrukturen Das Framework der Jäger und Sammler."—  Präsentation transkript:

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

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 ? ArraySystem.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 ICollection IListIDictionary Index Key For Each Support Count, CopyTo

10 Interfaces I IEnumerable For Each Support GetEnumerator() ICollection Inherits IEnumerable 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 Name Index / KeyKey eind. TypBemerkung Array Index-Object0 basiert ArrayList Index-ObjectÄndert Größe dynamisch, IList CollectionBase Index-TypedSelbstgemachte Collections Hashtable KeyJaObjectIDictionary DictionaryBase KeyJaTypedSelbstgemachte Dictionaries ListDictionary KeyJaObjectVerkettete Liste, für Count <11 HybridDictionary KeyJaObjectMix Hashtable + ListDictionary SortedList Index + KeyJaObjectSortiert nach Keys Collection Index + KeyJaObjectalte VB-Collection NameValueCollect. Index + KeyNeinStringEin Key für mehrere Strings NameObject- CollectionBase Index + KeyNeinTypedEigene NameObjectCollections StringCollection Index-String StringDictionary KeyJaString

17 Übersicht II – Die Exoten NameTypBemerkung QueueObjectFirst in First out StackObjectLast in First out BitArrayBits BitVektorBits32 Bits in einer Struktur, schnell DataSetDatenKeine Objektreferenzen XMLDocumentDatenKeine Objektreferenzen

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#) long[]row = {0,1,2,3}; long[]row = new long[4]; long[]row = new long[]{0,1,2,3}; Dim row()As Integer = {0,1,2,3} Dim row(4)As Integer 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 Demo ArrayList.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 Demo NameValueCol.

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 (CCustomer c in colCustDB.Values){ Console.Write (c.Caption); } foreach (DictionaryEntry d in colCustDB){ Console.Write (d.Key + d.Value); }

43 NameObjectCollectionBase 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 Demo NameObjColBase

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];} } Demo Tokens-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

51 IComparable In der Klasse selbst, eine Methode CompareTo Array.Sort ( ) public class CCustomer : IComparable {... //IComparable nach Caption int IComparable.CompareTo(object oCu){ CCustomer Cu = (CCustomer) oCu; return String.Compare (this.Caption,Cu.Caption); }

52 IComparer Separate Klassen, eine Methode: Compare Array.Sort (new CustSortByName) Demo Sortieren public class CustSortByName : IComparer { public CustSortByName() { } public int Compare(object obj1,object obj2){ CCustomer cu1 = (CCustomer) obj1; CCustomer cu2 = (CCustomer) obj2; return String.Compare (cu1.Nachname,cu2.Nachname); }

53 Alternativen Der andere Weg zur Sammlung: DataSet XMLDocument

54 ADO.Net DataSet Sehr flexible Datenstruktur Kann ohne Verbindung zu einer Datenbank erzeugt werden

55 Dataset - Füllen Mehrere Methoden zum Füllen dt.Rows.Add dt.LoadDataRow foreach (CCustomer xc in source_arrL){ dt.LoadDataRow( new object[] {xc.ID, xc.Key, xc.Nachname, xc.Vorname, xc.Land, xc.Alter}, true); }

56 DataSet - Zugriff Zugriff DataTable.Rows.Contains; DataTable.Rows[Index] DataRow = DataTale.Rows.Find DataRow[ ] = DataTable.Select foreach (int ID in Indicies){ cap = dt.Rows[ID].ItemArray[2].ToString(); }

57 DataSet gut für Relationale Daten kann mehrere Tabellen enthalten kann Foreign Key und Unique Constraints verwalten Erzeugen von Views Filtern und Sortieren sehr mächtige Funktionen Demo DataSet

58 XMLDocument viel XML in.Net XML hat einen gewissen Overhead gut für hierarchische Daten leicht zu erzeugen kann leicht visualisiert werden XSLT komplexe Abfragesprache XPath

59 XMLDocument Erzeugen aus DataSet Abfrage eines Knotens Select über alle Knoten XMLDocument xmlCustomers = new XmlDocument(); xmlCustomers.LoadXml(dsCustomers.GetXml()); Demo DataSet s = "Customer[Key = \"K10\"]"; XmlNode xn = xmlCustomers.SelectSingleNode(s); s = "/Customers/Customer[Land ='PERU']"; XmlNodeList xl = xmlCustomers.SelectNodes(s);

60 Schlußfolgerungen Und nun?

61 Zusammenfassung Die wichtigsten Typen Array, ArrayList (Index) Hashtable(Key) SortedList(Index und Key) Collectionbase, DictionaryBase String Collection / Dictionary Nicht vergessen DataSet XML-Document

62 Performance Durchschnitt aus 3 Tests Wer misst, misst Mist! Garbage Collection schlägt ab und zu zu Dadurch schwanken die Werte Die richtige Auswahl des Collection – Typs ersetzt kein gutes Design!

63 Laden 1000

64 Laden 30.000

65 Zufälliger Zugriff

66 Zufälliger Zugriff (30.000) Array (Index)00,00 ArrayList (Index)10,00 Queue (Dequeue)03,33 Stack (Pop)03,33 HashTable (Key);43,33 HashTable (ContainsKey)26,67 SortedList (Key)387,67 SortedList (GetByIndex)03,33 SortedList (ContainsKey)377,33 HybridDictionary (Key)37,00 HybridDictionary (ContainsKey)30,00 NameValueCollection (Index)20,00 NamedValueCollection (Key)70,00 NameValueCollection (GetKey)10,00

67 Zufälliger Zugriff (30.000) VB-Collection (Index)50,00 VB-Collection (Key)130,00 CCustomersDicBase (Key)36,67 CCustomersColBase (Index)10,00 CCustumersNameObjColBase (Index)13,33 CCustumersNameObjColBase (Key)66,67 StringCollection (Index)10,00 StringDictionary (Key)73,33 Dataset (Rows[Index])104,00 Dataset (Rows.Find)397,00 Dataset (Select+Sort=#196 Rows)220,33 XMLDocument (SelSingleNode,#150)16.066,67 XMLDocument (SelectNodes=#196)0,00

68 Links Code zum Vortrag http://www.gnoth.net/BASTA/Feb02.htm Dr. GUI von http://msdn.microsoft.com/http://msdn.microsoft.com/ In der MSDN nach Dr. GUI.NET #4 suchen

69 Fragen? Uff...


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

Ähnliche Präsentationen


Google-Anzeigen