Datum nach darauffolgenden Tagen gruppieren

Ehrlich gesagt habe ich etwas gebraucht um den Titel richtig zu wählen. Aber ich möchte einmal aufzeigen, welches Szenario ich meine:

Man hat eine Collection mit folgenden Datumelementen:

31.12.2014
01.01.2015
02.01.2015
16.02.2015
19.02.2015
20.02.2015

und möchte sie so sortieren:

Von – Bis

31.12.2014 02.01.2015
16.02.2015 16.02.2015
19.02.2015 20.02.2015

Als Quelle steht uns eine gefüllte List zur Verfügung:
[crayon-676b94b992dc7534620155/]
Das heißt, wenn der nächste Eintrag nicht der darauffolgende Tag ist, wird eine neue Gruppe erstellt.
[crayon-676b94b992dcd073201954/]
Möchte man nun noch die von und bis Werte auswerten, kann man folgendes nutzen:
[crayon-676b94b992dcf355642864/]
 

 

Quelle: http://stackoverflow.com/questions/27393626/in-c-what-is-the-best-way-to-group-consecutive-dates-in-a-list

 

 




ADODB Recordset to Arraylist

Ich weiß, ADODB ist veraltet und sollte nicht verwendet werden. Wer jedoch doch damit arbeiten muss, kann hier mal weiter lesen.

Namespace:
[crayon-676b94b9932f1667361904/]
Typen:
[crayon-676b94b9932f5090229548/]
Connections:
[crayon-676b94b9932f7107375929/]
 

Methode zu ArrayList
[crayon-676b94b9932f8606882328/]
 




Aktuelles Datum binden

 

als namespace hinzufügen:
[crayon-676b94b9934c1651246250/]
Den DateTimePicker erstellen:
[crayon-676b94b9934c4105277976/]




generische Listen / Collection

Zwar braucht die Dictionary<T, K> weniger Zeit beim hinzufügen/ löschen von Werten, braucht die SortedList doch weniger Ramkapazitäten und ist im großen und ganzen schneller. Deutlich langsamer ist die Hashtable und SortedDictionary.

<T> = Typenparameter, erwartet wird ein Datentyp als Parameter. Beispiel string, int, object,…

<V, K> = siehe <T>, jedoch wegen besserer Lesbarkeit stellt dieser Typenparameter den Wert des Value bzw. Key da.

 

List<T>
[crayon-676b94b9936f9785527487/]
SortedList<V, K>
[crayon-676b94b9936fe525447995/]
Beinhaltet einen Key und Value. Über den Key lässt sich das Value herausfinden. Beispiel:
[crayon-676b94b9936ff130978394/]
liefert den Wert Boolean Wert True

Dictionary<V, K>
[crayon-676b94b993701331895762/]
ArrayList (Object)
[crayon-676b94b993704906647526/]
 Hashtable (Object K, Object V)
[crayon-676b94b993705037484587/]
 ObservableCollection
[crayon-676b94b993707081306142/]
Im Gegensatz zur List<T> nutzt die ObservableCollection die INotifyCollectionChanged Schnittstelle. Diese gibt eine Meldung, sobald sich in der Collection etwas geändert hat. Sehr Sinnvoll, wenn man diese Collection an ein Steuerelement per WPF binden möchte, aktualisiert sich das Element so automatisch. Ein Nachteil ist jedoch, dass man die Liste nicht aus der Liste suchen/sortieren kann. Hier kann man nachlesen, wie man dies doch mit einbauen kann -> Link

List<Tuble<T,A,B>

Bisher hatten wir immer nur die Möglichkeit über Key / Value ein Pärchen vom Eintrag zu bilden. Manchmal kommt man aber in die Situation wo man nicht das Key/Value Prinzip haben möchte, oder mehr als 2 Argumente übergeben möchte. Da kommt das seit .NET 4.0 eingeführte Tuble ins Spiel. Die einzelnen Einträge werden dann als Item1, Item2 usw. innerhalb des Eintrags geführt.
[crayon-676b94b993708811858987/]
 

 Quelle: http://blog.bodurov.com/Performance-SortedList-SortedDictionary-Dictionary-Hashtable/




Delegaten und Events

Delegaten sind in C# aufgebaut wie normale Methoden, jedoch besitzen sie keinen Code der ausgeführt wird, sondern weisen lediglich auf eine Methode mit Code hin.

Das bedeutet, dass die Delegaten genau so wie Methoden

einen Zugriffsmodifikator (private, public ), einen Rückgabe wert und Parameter haben. Die Parameter müssen aber in der Anzahl und Datentyp den Methoden identisch sein.


[crayon-676b94b993a31257126203/]
 

Interessant werden Delegaten in Verbindung mit Events auf Deutsch Ereignisse. Events werden ausgelöst. Wenn man einen Button klickt, löst man das Click-Event aus. In WPF und Windows Forms haben die Steuerelemente z.B. viele vordefinierte Events. So kann man ein Mouseover Event auslösen lassen, wenn man z.B. mit der Maus über ein Steuerelement fährt. Sobald nun ein Event ausgelöst wird, versucht das an Ihm hängende Delegat eine Methode auszulösen mit den Rückgabewerten und Parameter, die dem Delegat zur Verfügung stehen. Das Interessante ist, dass ein Delegat unabhängig vom Zugriffsmodifikator arbeitet. An beide wird eine Methode durch überladung angehängt “ += “ oder abgezogen “ -= „.

Mal ein kleines Beispiel, wie wir mithilfe eines Delegaten und Event von einem neuen Window in das Mainwindow Label etwas schreiben können:

MainWindow:
[crayon-676b94b993a35206347402/]
Das neue Window1:
[crayon-676b94b993a37375854579/]
Hier sehen wir, dass zunächst im MainWindow dem Event vom Objekt w1 die Methode wnd_MyCustomEvent hinzugetan wurde. Jedesmal also, wenn das Event ausgeführt wird, wird auch diese Methode ausgeführt.

Im Window1 wird nun die Methode durch das klicken auf den cmd_w1_Button das Event MyEvent ausgelöst und dem dazugehörigen Delegaten wird der Parameter von 100 übergeben.

Abschließend wird nun im MainWindow dieser Wert angezeigt

 

Der nächste Schritt, den man gehen könnte ist, noch ein neues Window zu erstellen und dort eine Methode hinzufügen:
[crayon-676b94b993a38429033706/]
Dem MainWindow fügen wir hinzu:
[crayon-676b94b993a39632612077/]
Ausgabe ist eine Messagebox mit dem Wert 100 aus der Klasse in Window2 heraus




Kommentare und Regionen

Gewöhnlich verwendet man Kommentare zweierlei Weise. Zum einen kommentiert man einen Code aus, wenn man sich eine Änderung gemacht hat, aber immer die Option haben möchte es rückgängig machen zu können, zum anderen eben um z.B. eine bestimmte Funktion mit eigenen Worten zu beschreiben, damit ein anderer Entwickler sich schnell damit zurecht finden. Andererseits sei es nicht unterschätzt, dass man selbst eigenen Code nach einigen Wochen wieder verstehen lernen muss.

Ich habe bereits Codes gesehen, die eher wie ein Fußballfeld von oben gesehen aussehen, als nach einer Programmierkunst. Eine komplette grüne Landschaft ist natürlich irgendwo kontraproduktiv.

Unter C# hat man aber viel mehr Möglichkeiten etwas zu kommentieren als durch das bekannte //.

1. Der klassische Kommentar: 
[crayon-676b94b993c2f471082011/]
 2. Kommentar über mehrere Zeilen:
[crayon-676b94b993c32368773354/]
3. Kommentieren von Methoden/Klassen über <summery>:

Nachdem man eine Klasse/Methode geschrieben hat, kann man genau darüber einfach 3 Schrägstriche /// machen und ein summery-Kommentar wird generiert.  Die param Felder geben Auskunft über die Parameter, die gesetzt wurden.
[crayon-676b94b993c33600499555/]
2015-03-05_15-42-47

 

4. Regionen schaffen 

Zugegeben handelt es sich nicht um einen Kommentar, sondern um eine Möglichkeit bestimmte Teile in Regionen zu teilen um eine bessere Übersicht zu schaffen.

dies geschieht, indem man einfach
[crayon-676b94b993c35667576228/]
Nun kann man die Region schließen und hat einen bestimmten Codeteil sauber verpackt 🙂

2015-03-05_15-50-22

 

 




generische Klassen

Mit generischen Klassen kann man Datentyp unabhängigen Aufbau einer Klasse erreichen. Das bedeutet, man kann dann ein Objekt der Klasse erzeugen und sagen, dass die Methoden dort eben mit diesen Datentyp arbeiten soll, dem wir dem Objekt übergeben. Auch eine dort deklarierte Variable ist eben der Typ, der übergeben wurde.

Dabei arbeitet man mit einem sogenannten Typ-Parameter, welcher ähnlich einem Platzhalter für einen Datentyp stehen soll. Deutlicher wird das vielleicht durch das folgende Beispiel:


[crayon-676b94b993e05692366273/]
Die Klasse erhält einen Typenparameter T. Man könnte auch einen anderen Buchstaben nehmen (i.d.R. ist der erste immer ein T), oder durch Komma getrennt weitere Datentypen anfügen.

Etwas ungewöhnlicher sieht da die Klassen-Eigenschaft in der 2. Zeile aus. Denkt man sich das T weg, könnte dort ein int, string[], double oder sonstwas stehen.

Dann folgt ein Konstruktor, der dieser Eigenschaft nun einen Wert zuweist

und zum Schluss noch eine Methode, die diese Eigenschaft ausgibt.

 Contraints

im oberen Beispiel hätte man rein theoretisch die Möglichkeit alle möglichen Datentypen zu setzen. Möchte man dies aber auf eine bestimmte Art von Datentypen beschränken, so gibt es eine where Klausel. Das Muster erinnert dann ein wenig an SQL.

Dann nimmt die Klasse folgende Bezeichnung ein:
[crayon-676b94b993e08208551148/]
Dabei kann man daraus den Satz machen: „Filtere alle, die von der Elternklasse IComparable erben“. Dabei macht man sich am besten im Objektexplorer schlau, welche Einschränkungen man treffen möchte.

Möchte man ein Objekt erstellen und dieser Datentyp passt nicht unter das Gefilterte, wird bereits zur Entwicklungszeit ein Fehler angezeigt.

 

 

Quelle: http://www.dotnetperls.com/generic




Iteratoren

Das Verb iterieren bedeutet aus einer Kollektion (engl. Collection) nacheinander durch die enthaltenen Elemente durch zulaufen. Nichts anderes tut ja auch die foreach Schleife.

Doch was ist dazu Notwendig, damit eine Iteration stattfinden kann? Die Collection muss die IEnumerable Schnittstelle unterstützen.

IEnumerable besitzt einen Inhaltsverzeichnis (engl. Index) welcher alle Elemente der Liste durchnummeriert beinhaltet. Weiter hat die Schnittstelle eine Methode getEnumerable() um diesen Index auszugeben. Genau dies tut auch die foreach Schleife. Sie ruft die Methode getEnumerable() auf und durchläuft vom ersten bis zum letzten Enumerator.

Interatoren_Standard

Glücklicherweise beinhalten die meisten Collections in .NET diese Schnittstelle (Array, List, DataRow usw.)

Interatoren_2

Möchte man nun, dass eine Klasse nach einem bestimmten Muster iteriert wird, bietet es sich an, eine Metode in dieser Klasse zu erstellen welche vom Typ
[crayon-676b94b993fc6416652532/]
ist und die einzelnen  Collection Elemente neu setzt. Beispiel:
[crayon-676b94b993fc9347131803/]
[crayon-676b94b993fca626223613/]
durch einen Aufruf von
[crayon-676b94b993fcb947353170/]
wird auch nur die ersten 3 durchiteriert

 

 

Quelle: http://www.s-line.de/homepages/trac/wissen/dot-net/csharp-2.html




C# und MySQL /MariaDB

Als erstes benötigt man die MySql.Data.dll, die man als Verweis hinzufügen muss.
Dazu öffnen wir die Packet-Manager-Konsole durch den Tastenkürzel ALT + T + N + O und geben dort ein:
[crayon-676b94b99414d215346779/]
und bestätigen das Konsolenfenster mit Enter.

2. Namespace hinzufügen:
[crayon-676b94b994150547638842/]
3. StringBuilder erzeugen. Alternativ geht natürlich ein gewöhnlicher String:
[crayon-676b94b994151101829679/]
4.  Connection String erzeugen. Port kann evtl. ein anderer sein:
[crayon-676b94b994152135847182/]
 

In der Regel umschließt man Datenbankverbindungen in einem try/catch. Dies wird hier von meiner Seite aber aus Gründen der besseren Übersicht nicht getan. Solltet Ihr das so verwenden wollen, empfiehlt es sich definitiv einen try/catch Block um rum zu verwenden

Methode um ein SQL Befehl auszuführen
[crayon-676b94b994154545813819/]
Beispiel:
[crayon-676b94b994155318504583/]
 Methode um einen Befehl aus der Datenbank zu erhalten
[crayon-676b94b994156368619405/]
 

Beispiel:
[crayon-676b94b994157800004313/]
 




Google Chrome – Benutzername und Passwort auslesen

stand heute funktioniert die genannte Methode noch.

Ich möchte mit dieser Anleitung nicht erreichen, dass du damit die Passwörter anderer ausliest, sondern lediglich für eigene Zwecke einsetzt. Ich übernehme daher auch keine Haftung was ihr damit macht. Bitte, tue dir selbst den Gefallen und mache das nicht, denn das kann dein ganzes Leben verändern. Negativ natürlich!

Ich stelle hier 2 Klassen zur Verfügung. Die erste, von mir geschriebene für die Prozesse, die andere ist die Decodierung des Passwortes von einem Autor, vor dem ich meinen Hut ziehe.

Die Datei, welche sämtliche gespeicherte Anmeldedaten enthält findet ihr hier:
[crayon-676b94b994494820110490/]
Dabei lässt sich diese Datei „Login Data“ mit Sqlite öffnen und bearbeiten. Lediglich die Passwortfelder sind als BLOB gekennzeichnet, lassen sich aber wie oben bereits erwähnt dekodieren.

Sobald man ein Objekt der Klasse Chrome erzeugt, muss man als Parameter, einen Dateinamen .db angeben, worauf diese mit denselben Dateinamen mit [Objekt].removeTemp(„Dateiname.db“) gelöscht werden kann.

Das Objekt der Klasse Chrome enthält als Eigenschaft unter anderem 3 ausgelesene Listen: Site, Username, Password

chrome Download