From 7acd340ad198830e7893253b4630888cabed0933 Mon Sep 17 00:00:00 2001 From: wienkop <uwe.wienkop@th-nuernberg.de> Date: Tue, 11 May 2021 11:16:24 +0200 Subject: [PATCH] 2021-05-11 Generische Liste --- 08-2 Generics Intro/Program.cs | 31 +++- ...tions.csproj => 08-UbgExceptionsMo.csproj} | 0 08-UbgExceptionsDi/08-UbgExceptionsDi.csproj | 9 + 08-UbgExceptionsDi/Program.cs | 86 +++++++++ 08-x HTMLEngine/Program.cs | 94 +++++----- .../08-3 GenericList.csproj" | 9 + "0\303\2378-3 GenericList/GenericList.cs" | 166 ++++++++++++++++++ "0\303\2378-3 GenericList/Kfz.cs" | 112 ++++++++++++ "0\303\2378-3 GenericList/Person.cs" | 22 +++ "0\303\2378-3 GenericList/Program.cs" | 47 +++++ Prog2WienkopSS2021.sln | 14 +- 11 files changed, 534 insertions(+), 56 deletions(-) rename 08-UbgExceptions/{08-UbgExceptions.csproj => 08-UbgExceptionsMo.csproj} (100%) create mode 100644 08-UbgExceptionsDi/08-UbgExceptionsDi.csproj create mode 100644 08-UbgExceptionsDi/Program.cs create mode 100644 "0\303\2378-3 GenericList/08-3 GenericList.csproj" create mode 100644 "0\303\2378-3 GenericList/GenericList.cs" create mode 100644 "0\303\2378-3 GenericList/Kfz.cs" create mode 100644 "0\303\2378-3 GenericList/Person.cs" create mode 100644 "0\303\2378-3 GenericList/Program.cs" diff --git a/08-2 Generics Intro/Program.cs b/08-2 Generics Intro/Program.cs index 6e5123e..34a720c 100644 --- a/08-2 Generics Intro/Program.cs +++ b/08-2 Generics Intro/Program.cs @@ -3,7 +3,7 @@ using System.Diagnostics.CodeAnalysis; namespace _08_2_Generics_Intro { - class Person : IComparable<Person> + class Person : IComparable<Person> { string name, vorname; public Person(string Name, string Vorname) { name = Name;vorname = Vorname; } @@ -32,17 +32,33 @@ namespace _08_2_Generics_Intro //{ // return (a.CompareTo(b) < 0) ? a : b; //} - static T Min<T>(T a, T b) where T:IComparable<T> + static TYP Min<TYP>(TYP a, TYP b) where TYP:IComparable<TYP> { return (a.CompareTo(b)<0) ? a : b; } - // Dieser Aufruf ist nur dann gültig, wenn der Typ von a eine Methode CompareTo() enthält - // => Es muss sichergestellt sein, dass Typ T eine Methode CompareTo() besitzt + //static object Min(object a, object b) + //{ + // return (a.CompareTo(b) < 0) ? a : b; + //} + // Dieser Aufruf ist nur dann gültig, wenn der Typ von a eine Methode CompareTo() enthält + // => Es muss sichergestellt sein, dass Typ T eine Methode CompareTo() besitzt - // Constraint: Alle Typen sind erlaubt, welche die geforderten Eigenschaften (=Methoden) besitzen - // Hier: IComparable (=CompareTo) + // Constraint: Alle Typen sind erlaubt, welche die geforderten Eigenschaften (=Methoden) besitzen + // Hier: IComparable (=CompareTo) - + // where ~ Vertrag zwischen der Methode und der Verwendung + // Methode sagt, ich kann ..., WENN mir eine oder mehrere geforderte Methoden bereitgestellt werden + // Verwendung sagt, ich VERPFLICHTE mich, diese Methode bereitzustellen + // Compiler überwacht die Einhaltung des Vertrags + + //static int Min_int(int a, int b) + //{ + // return (a.CompareTo(b) < 0) ? a : b; + //} + //static double Min_double(double a, double b) + //{ + // return (a.CompareTo(b) < 0) ? a : b; + //} static void Main(string[] args) { @@ -50,7 +66,6 @@ namespace _08_2_Generics_Intro Console.WriteLine($"Minimum von 7.5 und 7.3: {Min(7.5, 7.3)}"); Console.WriteLine($"Minimum von Berta und Anton: {Min("Berta", "Anton")}"); Console.WriteLine($"Minimum von zwei Person-Objekten: {Min(new Person("Meier","Anton"), new Person ("Meier","Berta"))}"); - } } } diff --git a/08-UbgExceptions/08-UbgExceptions.csproj b/08-UbgExceptions/08-UbgExceptionsMo.csproj similarity index 100% rename from 08-UbgExceptions/08-UbgExceptions.csproj rename to 08-UbgExceptions/08-UbgExceptionsMo.csproj diff --git a/08-UbgExceptionsDi/08-UbgExceptionsDi.csproj b/08-UbgExceptionsDi/08-UbgExceptionsDi.csproj new file mode 100644 index 0000000..85153c1 --- /dev/null +++ b/08-UbgExceptionsDi/08-UbgExceptionsDi.csproj @@ -0,0 +1,9 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <OutputType>Exe</OutputType> + <TargetFramework>netcoreapp3.1</TargetFramework> + <RootNamespace>_08_UbgExceptionsDi</RootNamespace> + </PropertyGroup> + +</Project> diff --git a/08-UbgExceptionsDi/Program.cs b/08-UbgExceptionsDi/Program.cs new file mode 100644 index 0000000..d90a372 --- /dev/null +++ b/08-UbgExceptionsDi/Program.cs @@ -0,0 +1,86 @@ +using System; +using System.Runtime.Serialization; + +namespace _08_UbgExceptionsDi +{ + // Erstellen Sie eine Dummy-Methode Funktion1, die einen try-catch Block enthält und + // eine zweite Dummy-Methode Funktion2, die wiederum einen try-catch Block besitzt und + // eine Methode Funktion3, die bei ihrem Aufruf einen throw mit einer selbst + // erstellten Fehlerklasse zur Folge hat. + // Main ruft Funktion1, Funktion1 ruft Funktion2 + // und Funktion2 ruft Funktion3. Setzen Sie hinter die catches jeweils ein finally + // Schreiben Sie entsprechende catch-Methoden, werfen Sie den Fehler weiter + // und stellen Sie sicher, dass das Programm unter keinen Umständen mit einer Exception beendet wird! + + class Program + { + static void Main(string[] args) + { + try + { + Console.WriteLine("Main: Vor Aufruf der Funktion1"); + Funktion1(); + Console.WriteLine("Main: Nach Aufruf der Funktion1"); + } + catch (Exception) { Console.WriteLine("Hier ist noch etwas schief gegangen"); } + } + static void Funktion1() + { + try + { + Console.WriteLine("Funktion 1 vor Aufruf von F2"); + Funktion2(); + Console.WriteLine("Funktion 1 nach Aufruf von F2"); + } + catch (MeinFehler) + { + Console.WriteLine("Funktion 1 - catch MeinFehler"); + } + finally + { + Console.WriteLine("Funktion 1 - finally"); + } + Console.WriteLine("Funktion 1 - Ende"); + } + + static void Funktion2() + { + try + { + Console.WriteLine("Funktion 2 vor Aufruf von F3"); + Funktion3(); + Console.WriteLine("Funktion 2 nach Aufruf von F3"); + } + catch (MeinFehler) + { + Console.WriteLine("Funktion 2 - catch MeinFehler"); + throw; + } + finally + { + Console.WriteLine("Funktion 2 - finally"); + } + Console.WriteLine("Funktion 2 - Ende"); + } + static void Funktion3() + { + Console.WriteLine("Funktion 3 vor Aufruf von throw"); + throw new MeinFehler("Mein Fehler aus Funktion 3",12); + //Console.WriteLine("Funktion 3 nach Aufruf von throw"); + } + + } + + + class MeinFehler : Exception + { + public int Fehlercode { get; private set; } + + + public MeinFehler(string message, int Fehlercode) : base(message) + { + this.Fehlercode = Fehlercode; + } + + } +} diff --git a/08-x HTMLEngine/Program.cs b/08-x HTMLEngine/Program.cs index 3d1e1c8..bfdb516 100644 --- a/08-x HTMLEngine/Program.cs +++ b/08-x HTMLEngine/Program.cs @@ -4,73 +4,73 @@ using static System.Console; class Program { - // Test program for HTML generation: + // Test program for HTML generation: - //static void Main() - //{ - // // Generate HTML document and store result in string: + static void Main() + { + // // Generate HTML document and store result in string: - // string html = Engine.Generate - // ( - // new DocumentType(), + // string html = Engine.Generate + // ( + // new DocumentType(), - // new Html - // ( - // new Head - // ( - // new Title("Generated HTML5 Example") - // ), + // new Html + // ( + // new Head + // ( + // new Title("Generated HTML5 Example") + // ), - // new Body - // ( - // new Heading1("Welcome to the Technical University oAS Nuremberg"), + // new Body + // ( + // new Heading1("Welcome to the Technical University oAS Nuremberg"), - // new Paragraph - // ( - // "We have a distinct profile ", new Underline("and"), " strive to maintain ", new Underline("our"), " leading position among comparable universities." + // new Paragraph + // ( + // "We have a distinct profile ", new Underline("and"), " strive to maintain ", new Underline("our"), " leading position among comparable universities." - // ), + // ), - // new Heading2("Study for your future"), + // new Heading2("Study for your future"), - // new Paragraph - // ( - // 12, " departments provide more than ", 40, " degree programs in ", new Bold("engineering, business, design and social sciences."), - // new LineBreak(), - // "If you have questions, please contact the ", new Italic("Student Counseling Service"), " or the ", new Italic("Student Office.") - // ) - // ) - // ) - // ); + // new Paragraph + // ( + // 12, " departments provide more than ", 40, " degree programs in ", new Bold("engineering, business, design and social sciences."), + // new LineBreak(), + // "If you have questions, please contact the ", new Italic("Student Counseling Service"), " or the ", new Italic("Student Office.") + // ) + // ) + // ) + // ); - // // Write resulting HTML string: + // // Write resulting HTML string: - // WriteLine("GENERATED HTML DOCUMENT:"); + // WriteLine("GENERATED HTML DOCUMENT:"); - // WriteLine(html); + // WriteLine(html); - // WriteLine("\nPlease press a key to continue..."); + // WriteLine("\nPlease press a key to continue..."); - // ReadKey(true); + // ReadKey(true); - // /* - // // Write reformatted HTML string: + // /* + // // Write reformatted HTML string: - // WriteLine("\nREFORMATTED HTML DOCUMENT:"); + // WriteLine("\nREFORMATTED HTML DOCUMENT:"); - // WriteLine("\n<" + new DocumentType().TagId + ">\n" + System.Xml.Linq.XElement.Parse(html.Replace("\n", ""))); + // WriteLine("\n<" + new DocumentType().TagId + ">\n" + System.Xml.Linq.XElement.Parse(html.Replace("\n", ""))); - // WriteLine("\nPlease press a key to continue..."); + // WriteLine("\nPlease press a key to continue..."); - // ReadKey(true); - // */ + // ReadKey(true); + // */ - // // Show (original) HTML string in default browser: + // // Show (original) HTML string in default browser: - // WriteLine("\nSTARTING BROWSER WITH GENERATED DOCUMENT..."); + // WriteLine("\nSTARTING BROWSER WITH GENERATED DOCUMENT..."); - // System.IO.File.WriteAllText("Example.html", html); + // System.IO.File.WriteAllText("Example.html", html); - // System.Diagnostics.Process.Start("Example.html"); - //} + System.Diagnostics.Process.Start("Hallo.txt"); + } } \ No newline at end of file diff --git "a/0\303\2378-3 GenericList/08-3 GenericList.csproj" "b/0\303\2378-3 GenericList/08-3 GenericList.csproj" new file mode 100644 index 0000000..38c17ab --- /dev/null +++ "b/0\303\2378-3 GenericList/08-3 GenericList.csproj" @@ -0,0 +1,9 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <OutputType>Exe</OutputType> + <TargetFramework>netcoreapp3.1</TargetFramework> + <RootNamespace>_0ß8_3_GenericList</RootNamespace> + </PropertyGroup> + +</Project> diff --git "a/0\303\2378-3 GenericList/GenericList.cs" "b/0\303\2378-3 GenericList/GenericList.cs" new file mode 100644 index 0000000..67471a7 --- /dev/null +++ "b/0\303\2378-3 GenericList/GenericList.cs" @@ -0,0 +1,166 @@ +using System; +using System.Collections.Generic; +using System.Text; +namespace _08_3_GenericList +{ + + class Liste<T> where T:IComparable<T> + { + class LItem + { + public T data; + public LItem next = null, prev = null; + public LItem(T Data) { data = Data; } + + public override string ToString() + => $"Name: {data}, prev: {(prev == null ? "null" : prev.data.ToString())}, next: {(next == null ? "null" : next.data.ToString())}"; + } + + LItem first = null, last = null; + + public void AddEnd(T Data) + { + LItem newItem = new LItem(Data); + if (first == null) + first = last = newItem; + else // Es gibt schon Listenelemente + { + last.next = newItem; + newItem.prev = last; + last = newItem; + } + } + public void AddFront(T Data) + { + LItem newItem = new LItem(Data); + if (first == null) + first = last = newItem; + else + { + newItem.next = first; + first.prev = newItem; + first = newItem; + } + } + public void AddSorted(T InsData) + { + // 1. Fall: Leere Liste oder Anfügen am Listenende + if (first == null || last.data.CompareTo(InsData) <= 0) + AddEnd(InsData); + else if (InsData.CompareTo(first.data) <= 0) + // 2. Fall: Anfügen am Listenende + AddFront(InsData); + else + { + // Wir wissen: Das neue Element ist NICHT das erste und nicht das letzte Element + LItem newItem = new LItem(InsData); + + LItem item = first; + while (item.next.data.CompareTo(InsData) < 0) + item = item.next; + // bis hierher identisch zur einfach-verketteten Liste + newItem.next = item.next; // Vorwärtsverkettung vom neuen Element zur Restliste + newItem.prev = item; // Rückwärtsverkettung vom neuen Elenent zum Listenanfangsstück + item.next.prev = newItem; // Rückwärtsverkettung vom nachfolgenden Listenelement + item.next = newItem; // Vorwärtsverkettung zum neuen Element + } + } + public void DeleteFirst() + { + // Fall 1: Liste ist leer + // Fall 2: Liste besteht nur aus EINEM Element + // Fall 3: Liste hat mehr als ein Element + + if (first == null) // Fall 1 + return; + if (first == last) // Fall 2 + first = last = null; + else + { + first = first.next; + first.prev = null; + } + } + public void DeleteLast() + { + // Fall 1: Liste ist leer + // Fall 2: Liste besteht nur aus EINEM Element + // Fall 3: Liste hat mehr als ein Element + + if (first == null) // Fall 1 + return; + if (first == last) // Fall 2 + first = last = null; + else + { + last = last.prev; + last.next = null; + } + } + public void DeleteByName(T DelData) + { + // Fall 1: Liste ist leer + // Fall 2: Das gesuchte Element befindet sich am Anfang + // Fall 3: Das gesuchte Element befindet sich am Ende + // Fall 4: Das gesuchte Element befindet sich mittendrin + + if (first == null) // Fall 1 + return; + if (first.data.CompareTo(DelData) == 0) // Fall 2 + DeleteFirst(); + else if (last.data.CompareTo(DelData) == 0) // Fall 3 + DeleteLast(); + else + { + // Fall 4: Wir wissen: + // Das zu löschende Element befindet sich weder am Anfang noch am Ende + // --> Es gibt ein Vorgänger- UND ein Nachfolger-Element + LItem item = first.next; + while (item.next != null && item.data.CompareTo(DelData) != 0) + item = item.next; + if (item.next != null) + { + // d.h. Element wurde gefunden und item zeigt auf dieses Element + // 20 - 21 - 22 + item.prev.next = item.next; // 20 -> 22 Nachfolger + item.next.prev = item.prev; // 22 -> 20 Vorgänger + } + } + } + public void Print() + { + for (LItem item = first;item!=null;item=item.next) + { + Console.WriteLine(item.data); + } + Console.WriteLine("-------------------"); + } + public void PrintReverse() + { + for (LItem item = last; item != null; item = item.prev) + { + Console.WriteLine(item.data); + } + Console.WriteLine("-------------------"); + } + public bool Exist(T findData) + { + for (LItem item = first; item != null; item = item.next) + { + if (item.data.CompareTo(findData)==0) + return true; + } + return false; + } + public IEnumerator<T> Reverse() + { + for (LItem item = last; item != null; item = item.prev) + yield return item.data; + } + public IEnumerator<T> GetEnumerator() + { + for (LItem item = first; item != null; item = item.next) + yield return item.data; + } + } +} diff --git "a/0\303\2378-3 GenericList/Kfz.cs" "b/0\303\2378-3 GenericList/Kfz.cs" new file mode 100644 index 0000000..32edaed --- /dev/null +++ "b/0\303\2378-3 GenericList/Kfz.cs" @@ -0,0 +1,112 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace _08_3_GenericList +{ + abstract class Kfz : IComparable<Kfz> // KfzCoolStyle + // Ist die Basisklasse von mehreren kfz-Ausprägungen + { + // public string kennzeichen; -- Nicht public machen! + + protected string kennzeichen; + // protected ~ öffentlich für abgeleitete Klassen + // ~ private für alle anderen + + public int CompareTo(Kfz other) + => kennzeichen.CompareTo(other.kennzeichen); + + public Kfz(string Kennzeichen) { kennzeichen = Kennzeichen; } + // Initialisierung bzw. Parameterübernahme unbedingt über + // den Konstruktor realisieren!!! + + // public virtual double Steuern() { return -1; } + // virtual ~ Diese Methode kann/darf in einer + // von Kfz abgeleiteten Klasse überschrieben werden + // (Dies muss aber nicht gemacht werden!) + + public abstract double Steuern(); + // abstract ~ Diese Methode MUSS in jeder + // von Kfz abgeleiteten Klasse überschrieben werden + + // Abstrakte Klasse --> von dieser Klasse können keine Objekte angelegt werden + } + + class Pkw : Kfz // Pkw ist-ein Kfz + // Pkw ist eine Spezialisierung eines Kfz + // Pkw ist ein Kfz mit Zusatzeigenschaften + // Pkw erbt von Kfz + // Pkw ist von Kfz abgeleitet + { + int hubraum=1599; + int co2; + public Pkw(int Hubraum, int CO2, string Kennzeichen) + : base(Kennzeichen) + { + hubraum = Hubraum; + co2 = CO2; + } + public override double Steuern() + { + return (hubraum + 99) / 100 * 2; + } + public double CO2Wert() => co2; + + public override string ToString() + => $"Pkw: {kennzeichen}: {hubraum}"; + } + + class Motorrad : Kfz + { + public Motorrad(string Kennzeichen, int Hubraum) + : base (Kennzeichen) + { hubraum = Hubraum; } + int hubraum = 250; + public override double Steuern() + { + return (hubraum + 24) / 25 * 1.84; + } + public override string ToString() + => $"Motorrad: {kennzeichen}: {hubraum}"; + } + + class LKW : Kfz + { + int gewicht; + int hubraum; + public LKW(string Kennzeichen, int Gewicht, int Hubraum) + : base(Kennzeichen) + // Erst wird der Basisklassenkonstruktor aufgerufen + // DANN die eigene Initialiserung + { + // kennzeichen = Kennzeichen; + // Kein explizites Initialisieren von Basisklassen-Variablen!!! + gewicht = Gewicht; + hubraum = Hubraum; + } + public override double Steuern() + { + return 556; + } + public override string ToString() + => $"LKW: {kennzeichen}: {hubraum}"; + } + class Tieflader : LKW + { + int zuladung; + public Tieflader(string Kennzeichen, int Gewicht, int Hubraum, int Zuladung) + : base(Kennzeichen,Gewicht,Hubraum) + { zuladung = Zuladung; } + //public override double Steuern() => 999; + // Wenn in der abgeleiteten Klasse eine Überschreibung der + // Basisklassenmethodendefinition erfolgt, wird die Definition + // aus der Basisklasse verwendet + + public override double Steuern() + { + return base.Steuern(); + } + public override string ToString() + => $"Tieflader: {kennzeichen}: Zuladung: {zuladung}"; + } +} diff --git "a/0\303\2378-3 GenericList/Person.cs" "b/0\303\2378-3 GenericList/Person.cs" new file mode 100644 index 0000000..a7abf40 --- /dev/null +++ "b/0\303\2378-3 GenericList/Person.cs" @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace _08_3_GenericList +{ + class Person : IComparable<Person> + { + string name, vorname; + public Person(string Name, string Vorname) { name = Name; vorname = Vorname; } + + public int CompareTo(Person other) + { + int comp = name.CompareTo(other.name); + return (comp != 0) ? comp : vorname.CompareTo(other.vorname); + //string vollname1 = name + vorname; // "MeierAnton" + //string vollname2 = other.name + other.vorname; // "MeierBerta" + //return vollname1.CompareTo(vollname2); // "MeierAnton".CompareTo("MeierBerta") + } + public override string ToString() => $"{vorname} {name}"; + } +} diff --git "a/0\303\2378-3 GenericList/Program.cs" "b/0\303\2378-3 GenericList/Program.cs" new file mode 100644 index 0000000..4207335 --- /dev/null +++ "b/0\303\2378-3 GenericList/Program.cs" @@ -0,0 +1,47 @@ +using System; + +namespace _08_3_GenericList +{ + class Program + { + static void Main(string[] args) + { + Liste<int> il = new Liste<int>(); + il.AddSorted(10); + il.AddSorted(90); + il.AddSorted(60); + il.AddSorted(30); + il.AddSorted(80); + il.AddSorted(20); + il.Print(); + + Liste<string> sl = new Liste<string>(); + sl.AddSorted("Berta"); + sl.AddSorted("Dieter"); + sl.AddSorted("Emil"); + sl.AddSorted("Claudia"); + sl.AddSorted("Anton"); + sl.Print(); + + Liste<Person> pl = new Liste<Person>(); + pl.AddSorted(new Person("Meier", "Berta")); + pl.AddSorted(new Person("Meier", "Anton")); + pl.AddSorted(new Person("Huber", "Claudia")); + pl.Print(); + + //Liste<Liste<int>> ll = new Liste<Liste<int>>(); + //ll.AddSorted(il); + + Liste<Kfz> kl = new Liste<Kfz>(); + kl.AddSorted(new Pkw(1599, 100, "N-AB 123")); + kl.AddSorted(new Motorrad("ER-X 534", 250)); + kl.AddSorted(new LKW("FÜ-MN 543", 20000, 5000)); + kl.Print(); + + foreach (var item in kl) + { + Console.WriteLine(item); + } + } + } +} diff --git a/Prog2WienkopSS2021.sln b/Prog2WienkopSS2021.sln index 0bd2391..3927216 100644 --- a/Prog2WienkopSS2021.sln +++ b/Prog2WienkopSS2021.sln @@ -53,7 +53,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "07-Ubg Warenwirtschaft-Di", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "07-2 Intro Exceptions", "07-2 Intro Exceptions\07-2 Intro Exceptions.csproj", "{7E8671A1-00B5-4E86-AB29-67726F407BA1}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "08-UbgExceptions", "08-UbgExceptions\08-UbgExceptions.csproj", "{6E9854D3-DF28-467E-A744-EAE2936B981E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "08-UbgExceptionsMo", "08-UbgExceptions\08-UbgExceptionsMo.csproj", "{6E9854D3-DF28-467E-A744-EAE2936B981E}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "08-1 Exceptions", "08-1 Exceptions\08-1 Exceptions.csproj", "{F766FA48-BE15-429D-A4B3-B4CD13912C88}" EndProject @@ -61,6 +61,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "08-2 Generics Intro", "08-2 EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "08x HTML", "08-x HTMLEngine\08x HTML.csproj", "{BCED82D0-F95F-4D82-9019-2C63D6B3CC8A}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "08-UbgExceptionsDi", "08-UbgExceptionsDi\08-UbgExceptionsDi.csproj", "{57F7EAD8-D0C8-4080-B939-D2B4D0A7CC56}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "08-3 GenericList", "0ß8-3 GenericList\08-3 GenericList.csproj", "{05E06BC5-768E-44D2-82C3-B473AEEDBD6B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -183,6 +187,14 @@ Global {BCED82D0-F95F-4D82-9019-2C63D6B3CC8A}.Debug|Any CPU.Build.0 = Debug|Any CPU {BCED82D0-F95F-4D82-9019-2C63D6B3CC8A}.Release|Any CPU.ActiveCfg = Release|Any CPU {BCED82D0-F95F-4D82-9019-2C63D6B3CC8A}.Release|Any CPU.Build.0 = Release|Any CPU + {57F7EAD8-D0C8-4080-B939-D2B4D0A7CC56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {57F7EAD8-D0C8-4080-B939-D2B4D0A7CC56}.Debug|Any CPU.Build.0 = Debug|Any CPU + {57F7EAD8-D0C8-4080-B939-D2B4D0A7CC56}.Release|Any CPU.ActiveCfg = Release|Any CPU + {57F7EAD8-D0C8-4080-B939-D2B4D0A7CC56}.Release|Any CPU.Build.0 = Release|Any CPU + {05E06BC5-768E-44D2-82C3-B473AEEDBD6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {05E06BC5-768E-44D2-82C3-B473AEEDBD6B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {05E06BC5-768E-44D2-82C3-B473AEEDBD6B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {05E06BC5-768E-44D2-82C3-B473AEEDBD6B}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE -- GitLab