datenstrukturen n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Datenstrukturen PowerPoint Presentation
Download Presentation
Datenstrukturen

Loading in 2 Seconds...

play fullscreen
1 / 69

Datenstrukturen - PowerPoint PPT Presentation


  • 105 Views
  • Uploaded on

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.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Datenstrukturen' - ida


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
datenstrukturen

Datenstrukturen

Das Framework der Jäger und Sammler

Marcel Gnoth, NTeam GmbH

No. 239

zur person
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
Inhalt
  • Einführung
  • Interfaces – der Collections
  • Collections – Klassen im Framework
  • Collections – selbstgemacht
  • Sortieren – im Framework
  • Alternativen
  • Zusammenfassung
einf hrung

Einführung

Für Jäger und Sammler

die gute alte zeit
Die gute alte Zeit ........
  • VB 6
    • Arrays
    • VB - Collection
  • Scripting Runtime
    • Dictionary
und heute
.......und Heute ?

Array

System.Array

Collection

Dictionary

System.Collections...

Microsoft.VisualBasic.Collection

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

Interfaces

Was müssen Collections bieten?

interfaces bersicht
Interfaces Übersicht
  • IEnumerable, IEnumerator
  • ICollection
  • IList
  • IDictionary
  • IComparable
  • IComparer

IEnumerable

  • For Each Support

ICollection

  • Count, CopyTo

IList

IDictionary

  • Index
  • Key
interfaces i
Interfaces I
  • IEnumerable
    • For Each Support
    • GetEnumerator()
  • ICollection InheritsIEnumerable
    • Abzählen, Synchronisation, in Array kopieren
    • CopyTo(), Count, IsSynchronized, SyncRoot
interfaces ii
Interfaces II
  • IList Inherits ICollection, IEnumerable
    • Menge von Elementen,
    • Zugriff über Index
    • IsReadOnly, IsFixedSize
    • Add( ), Insert( )
    • Contains(), IndexOf()
    • Clear( ), Remove( ), RemoveAt( )
interfaces iii
Interfaces III
  • IDictionary Inherits ICollection, IEnumerable
    • Enthält DictionaryEntry – Elemente
    • Zugriff über Schlüssel
    • IsFixedSize, IsReadOnly
    • Keys, Values
    • Add( ), Remove( )
    • Clear( ), Contains( )
interfaces iv
Interfaces IV
  • IComparable, IComparer
    • Sortieren von Objekten
    • Später....
collections

Collections

Wir schreiten zur Tat...

bersicht collections
Übersicht Collections
  • 0 - basiert
  • Viele haben:
    • Constructor der ICollection akzeptiert
    • AddRange, RemoveRange
  • DataSource
  • Indexer
    • VB: myObj = Col.Item( 7 )
    • C#: myObj = Col [ 7 ]
array
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
array1
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
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 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
HashTable
  • Properties
    • Count
    • Keys, Values
  • Methoden
    • Add, Remove
    • ContainsKey, ContainsValue
  • Standard IDictionary Implementierung
  • Keine Sortierung
hashtable1
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
hashtable2
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);

}

hashtable3
HashTable
  • Einsatz:
    • Viele Objekte
    • Zufällige / ungeordnete Zugriffe
    • Zugriff über eindeutigen Key
    • Langsamer als ArrayList
listdictionary
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
HybridDictionary
  • Verwaltet kleine Mengen in ListDictionary
  • Wechselt automatisch zu Hashtable wenn Collection zu groß wird
  • System.Collections.Specialized
sortedlist
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
sortedlist1
SortedList
  • Properties
    • Item (Index / Key)
    • Capacity
    • Keys, Values
  • Methoden
    • Add, Remove, RemoveAt
    • ContainsKey, ContainsValue
    • IndexOfKey, IndexOfValue
visualbasic collection
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 collection1
VisualBasic.Collection
  • Kompatibilitätsgründe
  • Langsamer als ArrayList und Hashtable
string dictionary collection
String Dictionary / Collection
  • System.Collections.Specialized
  • StringCollection
    • Collection für Strings
  • StringDictionary
    • Hashtable für Strings
queue stack
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
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
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

Collections – selbstgemacht

So schmeckt es immer noch am besten!

eigene collection klassen
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
CollectionBase
  • ArrayList für eigene typisierte Collections
  • Über InnerList Property Zugriff auf ArrayList Member
  • Zugriff über Index
collectionbase implementierung
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
DictionaryBase
  • Hashtable für eigene typisierte Collections
  • InnerHashtable
  • Zugriff über Key
dictionarybase implementierung
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
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
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
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
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
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
IEnumerator
  • IEnumerable.GetEnumerator
    • muß Enumerator zurückgeben
  • Kann selbst implementiert werden
    • Nur in besonderen Anwendungsgebieten
    • Reihenfolge bei foreach verändern ....
    • .........
ienumerator beispiel
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

Sortieren im Framework

Auf die Reihenfolge kommt es an!

sortieren
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
IComparable
  • In der Klasse selbst, eine Methode
    • CompareTo
  • Array.Sort ( )

public class CCustomer : IComparable {

...

//IComparable nach Caption

intIComparable.CompareTo(object oCu){

CCustomer Cu = (CCustomer) oCu;

return String.Compare (this.Caption,Cu.Caption);

}

}

icomparer
IComparer

DemoSortieren

  • Separate Klassen, eine Methode:
    • Compare
  • Array.Sort (new CustSortByName)

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

Alternativen

Der andere Weg zur Sammlung:

DataSet

XMLDocument

ado net dataset
ADO.Net DataSet
  • Sehr flexible Datenstruktur
  • Kann ohne Verbindung zu einer Datenbank erzeugt werden
dataset f llen
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
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
DataSet

DemoDataSet

  • 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
xmldocument
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
xmldocument1
XMLDocument

DemoDataSet

  • Erzeugen aus DataSet
  • Abfrage eines Knotens
  • Select über alle Knoten

XMLDocument xmlCustomers = new XmlDocument();

xmlCustomers.LoadXml(dsCustomers.GetXml());

s = "Customer[Key = \"K10\"]";

XmlNode xn = xmlCustomers.SelectSingleNode(s);

s = "/Customers/Customer[Land ='PERU']";

XmlNodeList xl = xmlCustomers.SelectNodes(s);

zusammenfassung
Zusammenfassung
  • Die wichtigsten Typen
    • Array, ArrayList (Index)
    • Hashtable (Key)
    • SortedList (Index und Key)
    • Collectionbase, DictionaryBase
    • String Collection / Dictionary
  • Nicht vergessen
    • DataSet
    • XML-Document
performance
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!
links
Links
  • Code zum Vortrag
    • http://www.gnoth.net/BASTA/Feb02.htm
  • Dr. GUI von http://msdn.microsoft.com/
    • In der MSDN nach „Dr. GUI.NET #4“ suchen