diff --git a/.vs/prog2-ss2020-wienkop/DesignTimeBuild/.dtbcache.v2 b/.vs/prog2-ss2020-wienkop/DesignTimeBuild/.dtbcache.v2 index 8ad07f29394208c453c540eade091fee4d6735ff..55c85a233a14d3c44a0bf34c0a2b294acae35924 100644 Binary files a/.vs/prog2-ss2020-wienkop/DesignTimeBuild/.dtbcache.v2 and b/.vs/prog2-ss2020-wienkop/DesignTimeBuild/.dtbcache.v2 differ diff --git a/.vs/prog2-ss2020-wienkop/v16/.suo b/.vs/prog2-ss2020-wienkop/v16/.suo index df5df75cd96006f796e6c7159b3605cffc2352c3..ff9ce1fceb793457e6b22408fda581121b22be1c 100644 Binary files a/.vs/prog2-ss2020-wienkop/v16/.suo and b/.vs/prog2-ss2020-wienkop/v16/.suo differ diff --git a/07KeyValueList/KeyValue.cs b/07KeyValueList/KeyValuePaar.cs similarity index 62% rename from 07KeyValueList/KeyValue.cs rename to 07KeyValueList/KeyValuePaar.cs index 0df6f1fc6dc4bf1251ba28d9badfe734f1e61e0d..2c25c6ee5eabf90e075331fb1930b020a3b2ccf0 100644 --- a/07KeyValueList/KeyValue.cs +++ b/07KeyValueList/KeyValuePaar.cs @@ -5,13 +5,13 @@ using System.Text; namespace _07KeyValueList { - class KeyValue<K, V> : IComparable<KeyValue<K, V>> + class KeyValuePaar<K, V> : IComparable<KeyValuePaar<K, V>> where K : IComparable<K> { public K key; public V val; - public KeyValue(K key, V val) { this.key = key; this.val = val; } - public int CompareTo(KeyValue<K, V> other) + public KeyValuePaar(K key, V val) { this.key = key; this.val = val; } + public int CompareTo(KeyValuePaar<K, V> other) => key.CompareTo(other.key); public override string ToString() => $"{key}: {val}"; } diff --git a/07KeyValueList/Program.cs b/07KeyValueList/Program.cs index 285bcbb5d16bb5bbe128a7c319c810f9e0123fa1..f57e8f137d1f147e1ad34f78b018113b8947e3be 100644 --- a/07KeyValueList/Program.cs +++ b/07KeyValueList/Program.cs @@ -1,15 +1,58 @@ using System; +using System.Collections.Generic; namespace _07KeyValueList { + class Termin + { + public string was; + public string wer; + public Termin(string was, string wer) { this.was = was;this.wer = wer; } + public override string ToString() => $"Termin: {was} mit {wer}"; + } class Program { static void Main(string[] args) { - Liste<KeyValue<string, int>> kvListe = new Liste<KeyValue<string, int>>(); - kvListe.AddSorted(new KeyValue<string, int>("Wienkop", 1614)); - kvListe.AddSorted(new KeyValue<string, int>("Otsa", 1855)); + KeyValueListe<string, int> kvListe = new KeyValueListe<string, int>(); + kvListe["Wienkop"] = 1614; + kvListe["Otsa"] = 1855; + kvListe.Print(); + Console.WriteLine("-----------"); + kvListe["Otsa"] = 9999; + kvListe.Print(); + Console.WriteLine("-----------"); + + KeyValueListe<string, Termin> termine = new KeyValueListe<string, Termin>(); + termine["Wienkop"] = new Termin("IT-Proj", "Digitale Visitenkarte"); + termine.Print(); + //foreach (var item in termine) + //{ + // Console.WriteLine(item.val); + //} + + List<Termin> termineMi = new List<Termin>(); + termineMi.Add(new Termin("08:00 Prog2-Vorlesung", "Gruppe-Wienkop")); + termineMi.Add(new Termin ("09:45 Dig Bildbearbeitung","MA-MIN")); + + List<Termin> termineDi = new List<Termin>(); + termineDi.Add(new Termin("08:00 Prog2-Übung", "Gruppe-Wienkop")); + termineDi.Add(new Termin("09:45 Prog2-Vorlesung", "Gruppe-Wienkop")); + termineDi.Add(new Termin("11:30 Mitarbeiterbesprechung","Jobbörse")); + + KeyValueListe<string, List<Termin>> terminverwaltung = new KeyValueListe<string, List<Termin>>(); + terminverwaltung["03.06.2020"] = termineMi; + terminverwaltung["02.06.2020"] = termineDi; + + foreach (var tag in terminverwaltung) + { + Console.WriteLine($"\nTermine am {tag.key}:"); + foreach (var item in tag.val) + { + Console.WriteLine(item); + } + } } } } diff --git a/07KeyValueList/bin/Debug/netcoreapp3.1/07KeyValueList.dll b/07KeyValueList/bin/Debug/netcoreapp3.1/07KeyValueList.dll index a1631d8cc967e04440a84e435ae705748e429e0a..b74c9e26aafb644daacbe3ef2443017974f4c7a7 100644 Binary files a/07KeyValueList/bin/Debug/netcoreapp3.1/07KeyValueList.dll and b/07KeyValueList/bin/Debug/netcoreapp3.1/07KeyValueList.dll differ diff --git a/07KeyValueList/bin/Debug/netcoreapp3.1/07KeyValueList.pdb b/07KeyValueList/bin/Debug/netcoreapp3.1/07KeyValueList.pdb index 943bfa105a6de814d4be786000cca2dd28d3fcf8..e7deb1bcbcf9d68261b1a844950cdc3947ab5a3e 100644 Binary files a/07KeyValueList/bin/Debug/netcoreapp3.1/07KeyValueList.pdb and b/07KeyValueList/bin/Debug/netcoreapp3.1/07KeyValueList.pdb differ diff --git a/07KeyValueList/liste.cs b/07KeyValueList/liste.cs index 05ef612d87870b42175fbae47cb543b4fee95d65..2288bfe63b200229eec70081fd5a7901e1ed7570 100644 --- a/07KeyValueList/liste.cs +++ b/07KeyValueList/liste.cs @@ -1,28 +1,30 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Text; namespace _07KeyValueList { - class Liste<T> : IComparable<Liste<T>> where T : IComparable<T> + class KeyValueListe<K,V> /*: IComparable<KeyValueListe<K,V>>*/ where K : IComparable<K> { // Die Klasse Element ist nun eine *private* Klasse der Klasse StringListe // Die Methoden von StringListe dürfen auf private Member zugreifen // Methoden außerhalb von StringListe dürfen dies nicht! private class Element // Element ist eine private Hilfsklasse der Klasse StringListe { - public T daten; + public K key; + public V val; public Element next = null; - public Element(T daten) { this.daten = daten; } - public override string ToString() => daten.ToString(); + public Element(K key, V val) { this.key = key; this.val = val ; } + public override string ToString() => $"{key}: {val}"; } Element anf = null, ende = null; int anz = 0; // Sehr sinnvoll für Index-Ops //public StringListe() { } - public void AddEnd(T daten) + public void AddEnd(K key, V val) { - Element neuesElement = new Element(daten); // 1. Neues Element anlegen + Element neuesElement = new Element(key,val); // 1. Neues Element anlegen anz++; if (anf == null) // 2. Leere Liste? anf = ende = neuesElement; @@ -32,71 +34,158 @@ namespace _07KeyValueList ende = ende.next; } } - public void AddFront(T daten) - { - // 1. Leere Liste - // 2. Es existiert mind. ein Element - Element neuesElement = new Element(daten); // Neues Element anlegen - anz++; - if (anf == null) // 1.Fall: Leere Liste? - anf = ende = neuesElement; - else - { - neuesElement.next = anf; // 2. Fall - anf = neuesElement; - } - } - //public void AddBeforeNth(int index, string name) + #region Weitere Methoden + //public void AddFront(T daten) + //{ + // // 1. Leere Liste + // // 2. Es existiert mind. ein Element + // Element neuesElement = new Element(daten); // Neues Element anlegen + // anz++; + // if (anf == null) // 1.Fall: Leere Liste? + // anf = ende = neuesElement; + // else + // { + // neuesElement.next = anf; // 2. Fall + // anf = neuesElement; + // } + //} + ////public void AddBeforeNth(int index, string name) + ////{ + //// if (index < 0 || index > anz) + //// throw new ArgumentOutOfRangeException("Index außerhalb der Listengröße"); + //// if (index == 0) + //// AddFront(name); + //// else if (index == anz) + //// AddEnd(name); + //// else + //// { + //// Element neu = new Element(name); + //// anz++; + //// Element item = anf; + //// for (int i = 1; i < index; i++) + //// item = item.next; + //// neu.next = item.next; // Die Reihenfolge dieses und des nächsten Befehls ist ENTSCHEIDEND! + //// item.next = neu; + //// } + ////} + //public void AddSorted(T daten) + //{ + // // 1. Fall: Leere Liste oder Anfügen am Listenende + // if (anf == null || ende.key.CompareTo(daten) <= 0) + // AddEnd(daten); + // else + // { + // if (daten.CompareTo(anf.key) <= 0) + // AddFront(daten); + // else + // { + // // Wir wissen: Das neue Element ist nicht das erste und nicht das letzte Element + // Element neu = new Element(daten); + // anz++; + + // Element item = anf; + // while (item.next.key.CompareTo(daten) < 0) + // item = item.next; + // neu.next = item.next; + // item.next = neu; + // } + // } + //} + //public bool Suche(T daten) + //{ + // for (Element item = anf; item != null; item = item.next) + // { + // if (item.key.CompareTo(daten) == 0) + // return true; + // } + // return false; + //} + //public void DeleteFirst() + //{ + // // 1.Fall: Liste ist leer + // // 2.Fall: Liste besteht nur aus einem Element + // // 3.Fall: Liste hat mehr als ein Element + // if (anf == null) // 1. Fall + // return; + // anz--; + // if (anf == ende) // 2. Fall + // anf = ende = null; + // else + // anf = anf.next; // 3. Fall + //} + //public void DeleteLast() + //{ + // // 1.Fall: Liste ist leer + // // 2.Fall: Liste besteht nur aus einem Element + // // 3.Fall: Liste hat mehr als ein Element + // if (anf == null) // 1. Fall + // throw new NullReferenceException("Die Liste ist leer"); + // anz--; + // if (anf == ende) // 2. Fall + // anf = ende = null; + // else // 3. Fall + // { // Wir wissen: Die Liste hat mehr als ein Element, d.h. es gibt ein + // // vorletztes Element vorletzter.next == ende + // Element vorletzter = anf; + // while (vorletzter.next != ende) + // vorletzter = vorletzter.next; + // vorletzter.next = null; + // ende = vorletzter; + // } + //} + //public void DeleteNth(int index) + //{ + // // 1.Fall: Liste ist leer ODER Ind>=anz --> Fehler + // // 2.Fall: Ind == 0 --> DeleteFirst + // // 3.Fall: Ind == anz-1 --> DeleteLast + // // 4. Bis hierher: Liste hat mind. ein Element und das zu löschende Element + // // ist nicht das Erste oder Letzte + // if (anz == 0 || index >= anz) // 1. Fall + // throw new ArgumentOutOfRangeException("Außerhalb der Anzahl der Listenelemente"); + // if (index == 0) // 2. Fall + // DeleteFirst(); + // else if (index == anz - 1) // 3. Fall + // DeleteLast(); + // else + // { + // Element vorletzter = anf; + // for (int i = 0; i < index - 1; i++) // Liste bis zum n-1-ten Element durchlaufen + // vorletzter = vorletzter.next; + // vorletzter.next = vorletzter.next.next; + // anz--; + // } + //} + //public void DeleteByName(T other) //{ - // if (index < 0 || index > anz) - // throw new ArgumentOutOfRangeException("Index außerhalb der Listengröße"); - // if (index == 0) - // AddFront(name); - // else if (index == anz) - // AddEnd(name); + // // leere Liste ohne Elemente + // if (anf == null) + // return; + // // erstes Element = gesuchtes Element + // if (anf.key.CompareTo(other) == 0) + // DeleteFirst(); + // // Wir wissen jetzt: + // // Liste hat mind. ein Element UND das erste Element ist nicht das gesuchte Element // else // { - // Element neu = new Element(name); - // anz++; // Element item = anf; - // for (int i = 1; i < index; i++) + // // Durchlaufen der Liste + // // solange Elemente in Liste vorhanden und gesuchtes Element noch nicht gefunden + // while (item.next != null && item.next.key.CompareTo(other) != 0) // item = item.next; - // neu.next = item.next; // Die Reihenfolge dieses und des nächsten Befehls ist ENTSCHEIDEND! - // item.next = neu; + // // Wenn gesuchtes Element in Liste vorhanden + // // item = "B" + // if (item.next != null) // "C" + // { + // anz--; + // // Nächstes Element überspringen = löschen + // item.next = item.next.next; // item.next = null + // // Wenn gesuchtes Element == letztes Element: + // if (item.next == null) + // ende = item; + // } // } //} - public void AddSorted(T daten) - { - // 1. Fall: Leere Liste oder Anfügen am Listenende - if (anf == null || ende.daten.CompareTo(daten) <= 0) - AddEnd(daten); - else - { - if (daten.CompareTo(anf.daten) <= 0) - AddFront(daten); - else - { - // Wir wissen: Das neue Element ist nicht das erste und nicht das letzte Element - Element neu = new Element(daten); - anz++; - - Element item = anf; - while (item.next.daten.CompareTo(daten) < 0) - item = item.next; - neu.next = item.next; - item.next = neu; - } - } - } - public bool Suche(T daten) - { - for (Element item = anf; item != null; item = item.next) - { - if (item.daten.CompareTo(daten) == 0) - return true; - } - return false; - } + #endregion public void Print() { for (Element item = anf; item != null; item = item.next) @@ -104,16 +193,14 @@ namespace _07KeyValueList Console.WriteLine(item); } } - public IEnumerator<T> GetEnumerator() + public IEnumerator<KeyValuePaar<K,V>> GetEnumerator() { for (Element item = anf; item != null; item = item.next) { - yield return item.daten; // Merken dieser Ausführungsposition - // UND Zurückliefern von item.name - // Beim nächsten Aufruf von GetEnumerator() wird - // an der gespeicherten Pos. weitergemacht. + yield return new KeyValuePaar<K, V>(item.key, item.val); } } + //public IEnumerable<T> Filter(string pattern) //{ // for (Element item = anf; item != null; item = item.next) @@ -126,117 +213,41 @@ namespace _07KeyValueList // } //} - public void DeleteFirst() - { - // 1.Fall: Liste ist leer - // 2.Fall: Liste besteht nur aus einem Element - // 3.Fall: Liste hat mehr als ein Element - if (anf == null) // 1. Fall - return; - anz--; - if (anf == ende) // 2. Fall - anf = ende = null; - else - anf = anf.next; // 3. Fall - } - public void DeleteLast() - { - // 1.Fall: Liste ist leer - // 2.Fall: Liste besteht nur aus einem Element - // 3.Fall: Liste hat mehr als ein Element - if (anf == null) // 1. Fall - throw new NullReferenceException("Die Liste ist leer"); - anz--; - if (anf == ende) // 2. Fall - anf = ende = null; - else // 3. Fall - { // Wir wissen: Die Liste hat mehr als ein Element, d.h. es gibt ein - // vorletztes Element vorletzter.next == ende - Element vorletzter = anf; - while (vorletzter.next != ende) - vorletzter = vorletzter.next; - vorletzter.next = null; - ende = vorletzter; - } - } - public void DeleteNth(int index) + + + private Element ElementSearch(K key) { - // 1.Fall: Liste ist leer ODER Ind>=anz --> Fehler - // 2.Fall: Ind == 0 --> DeleteFirst - // 3.Fall: Ind == anz-1 --> DeleteLast - // 4. Bis hierher: Liste hat mind. ein Element und das zu löschende Element - // ist nicht das Erste oder Letzte - if (anz == 0 || index >= anz) // 1. Fall - throw new ArgumentOutOfRangeException("Außerhalb der Anzahl der Listenelemente"); - if (index == 0) // 2. Fall - DeleteFirst(); - else if (index == anz - 1) // 3. Fall - DeleteLast(); - else + for (Element item = anf; item != null; item=item.next) { - Element vorletzter = anf; - for (int i = 0; i < index - 1; i++) // Liste bis zum n-1-ten Element durchlaufen - vorletzter = vorletzter.next; - vorletzter.next = vorletzter.next.next; - anz--; + if (item.key.CompareTo(key) == 0) + return item; } + return null; } - public void DeleteByName(T other) + public V this[K key] { - // leere Liste ohne Elemente - if (anf == null) - return; - // erstes Element = gesuchtes Element - if (anf.daten.CompareTo(other) == 0) - DeleteFirst(); - // Wir wissen jetzt: - // Liste hat mind. ein Element UND das erste Element ist nicht das gesuchte Element - else + get { - Element item = anf; - // Durchlaufen der Liste - // solange Elemente in Liste vorhanden und gesuchtes Element noch nicht gefunden - while (item.next != null && item.next.daten.CompareTo(other) != 0) - item = item.next; - // Wenn gesuchtes Element in Liste vorhanden - // item = "B" - if (item.next != null) // "C" - { - anz--; - // Nächstes Element überspringen = löschen - item.next = item.next.next; // item.next = null - // Wenn gesuchtes Element == letztes Element: - if (item.next == null) - ende = item; - } + Element item = ElementSearch(key); + if (item != null) + return item.val; + throw new Exception($"Der Schlüssel {key} wurde nicht gefunden!"); } - } - private Element NthElem(int index) - { - if (index < 0 || index >= anz) - throw new IndexOutOfRangeException("Listenindex außerhalb des gültigen Bereichs"); - Element item = anf; - while (index > 0) + set { - item = item.next; - index--; + Element item = ElementSearch(key); + if (item != null) // Existiert der Schlüssel schon in der Liste? + item.val = value; // JA: Wert aktualisieren + else + AddEnd(key, value); // NEIN: Neues Schlüssel|Wert-Objekt der Liste hinzufügen } - return item; - } - public T this[int index] - { - get => NthElem(index).daten; - set { NthElem(index).daten = value; } - } - public Liste<T> Reverse() // DIES IST NICHT DIE LÖSUNG FÜR DIE PRAKTIKUMSAUFGABE!!! - { - Liste<T> neueListe = new Liste<T>(); - for (Element item = anf; item != null; item = item.next) - neueListe.AddFront(item.daten); - return neueListe; } - public int CompareTo(Liste<T> other) => anz - other.anz; + + //public int CompareTo(KeyValueListe<K, V> other) + //{ + // throw new NotImplementedException(); + //} } } diff --git a/07KeyValueList/obj/Debug/netcoreapp3.1/07KeyValueList.csproj.CoreCompileInputs.cache b/07KeyValueList/obj/Debug/netcoreapp3.1/07KeyValueList.csproj.CoreCompileInputs.cache index c205e14f57fc973be917d95d52aef3c52b47acfd..5b4c5ef652ac1f641968d7f882b541f8daa439fb 100644 --- a/07KeyValueList/obj/Debug/netcoreapp3.1/07KeyValueList.csproj.CoreCompileInputs.cache +++ b/07KeyValueList/obj/Debug/netcoreapp3.1/07KeyValueList.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -9b70b59186c0c0f8a2b5bc4d55137c362b4a3bbd +f8b0ec365030a8006743282e0105ee637814682b diff --git a/07KeyValueList/obj/Debug/netcoreapp3.1/07KeyValueList.csproj.FileListAbsolute.txt b/07KeyValueList/obj/Debug/netcoreapp3.1/07KeyValueList.csproj.FileListAbsolute.txt index 955bd301339dbac293df2ee229db4210fe7afaf0..22f16afb3fc0f40154588b654d1b9dc4966a356b 100644 --- a/07KeyValueList/obj/Debug/netcoreapp3.1/07KeyValueList.csproj.FileListAbsolute.txt +++ b/07KeyValueList/obj/Debug/netcoreapp3.1/07KeyValueList.csproj.FileListAbsolute.txt @@ -10,3 +10,4 @@ C:\Users\wienkop\source\repos\prog2-ss2020-wienkop\07KeyValueList\obj\Debug\netc C:\Users\wienkop\source\repos\prog2-ss2020-wienkop\07KeyValueList\obj\Debug\netcoreapp3.1\07KeyValueList.dll C:\Users\wienkop\source\repos\prog2-ss2020-wienkop\07KeyValueList\obj\Debug\netcoreapp3.1\07KeyValueList.pdb C:\Users\wienkop\source\repos\prog2-ss2020-wienkop\07KeyValueList\obj\Debug\netcoreapp3.1\07KeyValueList.genruntimeconfig.cache +C:\Users\wienkop\source\repos\prog2-ss2020-wienkop\07KeyValueList\obj\Debug\netcoreapp3.1\07KeyValueList.csprojAssemblyReference.cache diff --git a/07KeyValueList/obj/Debug/netcoreapp3.1/07KeyValueList.csprojAssemblyReference.cache b/07KeyValueList/obj/Debug/netcoreapp3.1/07KeyValueList.csprojAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..74fe67b1ca671095970d4a7fbcae2417231e8f41 Binary files /dev/null and b/07KeyValueList/obj/Debug/netcoreapp3.1/07KeyValueList.csprojAssemblyReference.cache differ diff --git a/07KeyValueList/obj/Debug/netcoreapp3.1/07KeyValueList.dll b/07KeyValueList/obj/Debug/netcoreapp3.1/07KeyValueList.dll index a1631d8cc967e04440a84e435ae705748e429e0a..b74c9e26aafb644daacbe3ef2443017974f4c7a7 100644 Binary files a/07KeyValueList/obj/Debug/netcoreapp3.1/07KeyValueList.dll and b/07KeyValueList/obj/Debug/netcoreapp3.1/07KeyValueList.dll differ diff --git a/07KeyValueList/obj/Debug/netcoreapp3.1/07KeyValueList.pdb b/07KeyValueList/obj/Debug/netcoreapp3.1/07KeyValueList.pdb index 943bfa105a6de814d4be786000cca2dd28d3fcf8..e7deb1bcbcf9d68261b1a844950cdc3947ab5a3e 100644 Binary files a/07KeyValueList/obj/Debug/netcoreapp3.1/07KeyValueList.pdb and b/07KeyValueList/obj/Debug/netcoreapp3.1/07KeyValueList.pdb differ