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

Slides:



Advertisements
Ähnliche Präsentationen
WebCast: Managed Smart Tags mit VSTO Jens Häupel.NET Technologieberater Microsoft Deutschland GmbH
Advertisements

Datasets und Objektmodelle
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 14: Mehrfachvererbung.
Best Practices in der Datenbank-programmierung
University of Applied Sciences Übung Objektorientierte Programmierung II Dipl.-Inf. (FH) Markus Vogler.
Der Foliensatz ist unter einer Creative Commons-Lizenz lizenziert:
Problemlösen am Beispiel des Rückwärtsarbeitens
Stichwortverzeichnis
Michael Artin: Geometric Algebra
8 Zündung/Motormanagement
Stichwortverzeichnis
2 Elektrische Maschinen in Kraftfahrzeugen
Herstellung von kristallinen Metalloxiden über die Schmelze mit einem Spiegelofen Gruppe 8: Yuki Meier, Vivien Willems, Andrea Scheidegger, Natascha Gray.
Inhaltsverzeichnis In der vorliegenden Präsentation finden Sie unter anderem Antworten auf folgende Fragen… warum ist eine Gesetzesinitiative zum Betriebliches.
Einführung in Web- und Data-Science
Algorithmen und Datenstrukturen
Algorithmen und Datenstrukturen
Industrie 4.0 für die Ausbildung 4.0
Entwicklung epistemologischer Überzeugungen
Das Verdauungssystem Präsentiert von Theresa
Rehwild die richtige Altersbestimmung
PSG II Neuer Pflegebedürftigkeitsbegriff und dessen Begutachtung (NBA)
Medientechnische Infrastrukturen für virtuelle und lokale Lernräume
Wissensmanagement im Zeitalter von Digitaler Transformation
«Wir bereiten uns auf die Deutschlandreise vor»
Pflege & Finanzierung 01. Juni 2017 Dr. Sonja Unteregger
Das Arbeitgebermodell in Zeiten des
Mathematik 10.
Betriebliche Gesundheitsförderung 2
Vorlesung Wasserwirtschaft & Hydrologie I
Liebe BetrachterInnen,
Forschungsmethoden in der Teilchenphysik
Neue Unterrichtsmaterialien zur Teilchenphysik Philipp Lindenau CERN | Herzlich willkommen! Präsentation mit Notizen hinterlegt!
Eröffnungsveranstaltung
Roomtour - Podio für Anfänger
175 Jahre UZH Krisenkommunikation
Einführung in die Benutzung des Einkaufportals der Eckelmann AG
Wer wir sind! Ihr S-Campus-Team direkt im Campus Center. Sven Deussing
Non-Standard-Datenbanken
Amand Fäßler 3. Januar 2017; RC Bregenz
Non-Standard-Datenbanken
Menger-Schwamm Ausgangsfigur in Stufe 0 ist ein Würfel
Sortieren auf Multiprozessorrechnern
Wurzeln und Irrationalität nach U.Wagner, OHG Tuttlingen
Eine kleine Einführung in das Projekt „Mausefallenauto“
Standorte, Verflechtungen und regionale Disparitäten VO 5
Generative Posenschätzung
Genau lesen - Wortaufbau Spezial-App für Igel-Fans
Innovation durch Genie
Einfache Schritte zur Anwendung der LOGICON Caries Detector Software
Metrik Sondermaschinenbau e. K.
Remo Zandonella Chancen und Herausforderungen der Digitalisierung auf die NRP-Zielgruppen Studie im Auftrag des SECO - Zwischenstand Fribourg, 24.
Retraite KIS August 2016 Meisterschwanden Dr. med. Stefan Roth
Jahresablauf und Wetter
Рассказываем о погоде МОУ СОШ №1 г.п.п Чистые Боры
Morphonologie der Verben 2 Präteritum
Roma, Sinti und Jenische Stand- und Durchgangsplätze
Übersicht
Seh dir in Ruhe die Bilder an und lies, wie du mich erreichen kannst.
GUTES TUN IN DER WELTOING
Vorlesung 7 Themen: Geoinformationssysteme in der Wasserwirtschaft
Kaufe einen Hund !!!.

Wie heißt du?.
Prozessoptimierung aus einem anderem Blickwinkel
Web Scale Discovery Service
Fachdidaktisches Seminar Geobiologie; WS 2016/17
Gebäude-Systemtechnik von ABB IP-Gateway
mwb fairtrade Wertpapierhandelsbank AG
 Präsentation transkript:

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

Zur Person Dipl. Inf. Marcel Gnoth, MCSD NTeam GmbH, Berlin 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 ? ArraySystem.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 ICollection IListIDictionary Index Key For Each Support Count, CopyTo

Interfaces I IEnumerable For Each Support GetEnumerator() ICollection Inherits IEnumerable 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 ]

Ü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

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

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#) 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; }

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 Demo ArrayList.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 Demo NameValueCol.

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

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

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

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); }

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); }

Alternativen Der andere Weg zur Sammlung: DataSet XMLDocument

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

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); }

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(); }

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

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

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);

Schlußfolgerungen Und nun?

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

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!

Laden 1000

Laden

Zufälliger Zugriff

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

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

Links Code zum Vortrag Dr. GUI von In der MSDN nach Dr. GUI.NET #4 suchen

Fragen? Uff...