[C#] List<T> filter Problem

02/23/2015 21:28 Cotigo#1
Hallo,

ich habe ein Problem mit einem Programm, dass ich momentan in der Berufsschule programmieren soll, zwar in Java, aber C# tut es auch, da es mir hauptsächlich um dieses eine Problem geht.
Undzwar soll ein provisorisches Programm geschrieben werden was für eine Firma sein soll die Flugzeuge vermietet und damit sie besseren Überblick bekommen, soll eine Software her (natürlich soll alles über die Konsole gehen).
Sobald eine Reservierung getätigt wurde soll mithilfe der Uhrzeit gefiltert werden, welches Flugzeug um die oder jene Zeit frei wäre bei der nächsten Reservierung.
Beispiel:
Kunde #1 reserviert das Flugzeug #1 von 8 bis 9 Uhr.
Kunde #2 möchte ebenfalls von 8 bis 9 Uhr eine Reservierung, hat aber nur noch Flugzeug #2 bis #4 zur Verfügung.

Das Problem an dieser Sache ist, dass meine Abfrage nicht ihren Sinn erfüllt, sondern immer alle Flugzeuge anzeigt egal ob eine Reservierung vorhanden ist oder nicht.

Hier ist unteranderem der Code.
Nicht wundern warum bei der Filter Funktion (chkFlugzeuge) die Uhrzeit drin steht, dass ist nur schonmal vorbereitet. Ich wollte erstmal sehen ob es überhaupt funktioniert egal welche Uhrzeit genommen wird.
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Flugzeug
{
    class Program
    {
        public static List<string> res_name;
        public static List<int> res_suhr;
        public static List<int> res_euhr;
        public static List<string> res_flug;
        public static List<string> flugzeuge;

        public static void echo(string msg)
        {
            Console.WriteLine(msg);
        }
        public static void echo(string msg, bool br)
        {
            if (br)
                Console.WriteLine(" ");
            Console.WriteLine(msg);
        }

        public static bool chkEnter(string line)
        {
            bool value = false;
            int x;
            if (int.TryParse(line, out x))
                value = true;
            else
                value = false;
            return value;
        }

        public static void chkFlugzeuge(int suhr)
        {
            for (int i = 0; i < flugzeuge.Count; i++)
            {
                for (int z = 0; z < res_flug.Count; z++)
                {
                    if (flugzeuge[i] == res_flug[z])
                    {
                        flugzeuge.RemoveAt(i);
                    }
                }
            }
            for (int i = 0; i < flugzeuge.Count; i++)
                echo(flugzeuge[i]);
        }

        static void Main(string[] args)
        {
            res_name = new List<string>();
            res_suhr = new List<int>();
            res_euhr = new List<int>();
            res_flug = new List<string>();
            bool _break = false, error = false;
            int eingabe, uhrzeit1, uhrzeit2;
            string line, name, flug;
            while (_break != true)
            {
                echo("1 - Reservierungen", true);
                echo("2 - Übersicht");
                echo("0 - Beenden");
                line = Console.ReadLine();
                if (chkEnter(line))
                {
                    eingabe = Convert.ToInt32(line);
                    switch (eingabe)
                    {
                        case 0:
                            _break = true;
                            break;
                        case 1:
                            #region Reservierungen
                            echo("1 - Neue Reservierung", true);
                            echo("2 - Reservierung einsehen");
                            echo("0 - Zurück");
                            line = Console.ReadLine();
                            if (chkEnter(line))
                            {
                                eingabe = Convert.ToInt32(line);
                                switch (eingabe)
                                {
                                    case 0:
                                    default:
                                        break;
                                    case 1:
                                        #region Neue Reservierung
                                        flugzeuge = new List<string>();
                                        flugzeuge.Add("Flugzeug #1");
                                        flugzeuge.Add("Flugzeug #2");
                                        flugzeuge.Add("Flugzeug #3");
                                        flugzeuge.Add("Flugzeug #4");
                                        echo("Geben Sie den Namen ein.");
                                        name = Console.ReadLine();
                                        echo("Ab wann ist die Reservierung?");
                                        echo("8 Uhr = 8; 12 Uhr = 12");
                                        line = Console.ReadLine();
                                        if (!chkEnter(line))
                                        {
                                            echo("Falsche Eingabe!");
                                            echo("Reservierung wird abgebrochen.");
                                            if (error != true) break;
                                        }
                                        uhrzeit1 = Convert.ToInt32(line);
                                        echo("Bis wieviel Uhr soll die Reservierung gehen?");
                                        echo("8 Uhr = 8; 12 Uhr = 12");
                                        line = Console.ReadLine();
                                        if (!chkEnter(line))
                                        {
                                            echo("Falsche Eingabe!");
                                            echo("Reservierung wird abgebrochen.");
                                            if (error != true) break;
                                        }
                                        uhrzeit2 = Convert.ToInt32(line);
                                        if (uhrzeit1 > uhrzeit2)
                                        {
                                            echo("Die Startzeit ist größer als die Endzeit.");
                                            echo("Reservierung wird abgebrochen.");
                                            break;
                                        }
                                        echo("Welches Flugzeug soll reserviert werden?");
                                        chkFlugzeuge(uhrzeit1);
                                        flug = Console.ReadLine();
                                        if (!error)
                                        {
                                            res_name.Add(name);
                                            res_suhr.Add(uhrzeit1);
                                            res_euhr.Add(uhrzeit2);
                                            res_flug.Add(flug);
                                        }
                                        break;
                                        #endregion
                                    case 2:
                                        #region Reservierungsübersicht
                                        echo("Flugzeug | Name | Von - Bis", true);
                                        string[] _resname = res_name.ToArray();
                                        int[] _ressuhr = res_suhr.ToArray();
                                        int[] _reseuhr = res_euhr.ToArray();
                                        string[] _resflug = res_flug.ToArray();
                                        if (_resname.Length > 0)
                                        {
                                            for (int i = 0; i < _resname.Length; i++)
                                            {
                                                echo("Flugzeug #" + _resflug[i] + " | " + _resname[i] + " | " + _ressuhr[i] + " Uhr - " + _reseuhr[i] + " Uhr");
                                            }
                                        }
                                        else
                                        {
                                            echo("Keine Einträge gefunden.");
                                        }
                                        break;
                                        #endregion
                                }
                            }
                            else
                            {
                                echo("Falsche Eingabe!");
                                if(error != true)   error = true;
                            }
                            break;
                            #endregion
                        case 2:
                            #region Übersicht
                            break;
                            #endregion
                        default:
                            break;
                    }
                }
                else
                {
                    echo("Falsche Eingabe!");
                }
            }
        }
    }
}
Ich hoffe es kann mir einer auf die Sprünge helfen.
Wenn sonst jemand noch Verbesserungsvorschläge zu meiner Programmiertechnik hat, kann es gerne dazuschreiben. =)

MfG
Cotigo
02/25/2015 12:27 Dingtax#2
Der Fehler liegt bei deinen Listen.
Code:
res_flug[0] = "4"  //Beispiel
res_flug[1] = "2"  //Beispiel

flugzeuge[0] = "Flugzeug #1"
flugzeuge[1] = "Flugzeug #2"
flugzeuge[2] = "Flugzeug #3"
flugzeuge[3] = "Flugzeug #4"
Da wir bei flugzeuge[i] == res_flug[z] nie "true" herauskommen ;)

02/25/2015 13:12 Mostey#3
1.
Code:
        public static void echo(string msg)
        {
            Console.WriteLine(msg);
        }
        public static void echo(string msg, bool br)
        {
            if (br)
                Console.WriteLine(" ");
            Console.WriteLine(msg);
        }
Wieso schreibst du im Code Console.ReadLine aber weigerst dich, Console.WriteLine zu schreiben und definierst dafür einen Alias?
Zweitens: Beide Funktionen können zusammengelegt werden indem du dem Parameter br einen Standardwert zuweist.

=

Code:
        public static void echo(string msg, bool br = false)
        {
            if (br)
                Console.WriteLine(" ");
            Console.WriteLine(msg);
        }

        // ...
        echo("Hi!");
        echo("Hallooooooooo", true);
2. C# und Java sind beide objektorientiert und das ist gut so. Du solltest diesen massiven Vorteil nutzen weil Objektorientierung unter anderem auch für wesentlich besser lesbaren Code sorgt und diesen ebenfalls minimieren wird.

3.
Code:
 public static void chkFlugzeuge(int suhr)
        {
            for (int i = 0; i < flugzeuge.Count; i++)
            {
                for (int z = 0; z < res_flug.Count; z++)
                {
                    if (flugzeuge[i] == res_flug[z])
                    {
                        flugzeuge.RemoveAt(i);
                    }
                }
            }
            for (int i = 0; i < flugzeuge.Count; i++)
                echo(flugzeuge[i]);
        }
So etwas hast du halt häufig, wenn du die Vorteile der Objektorientierung nicht nutzt und das lässt sich ganz einfach vermeiden, indem du Relationen zwischen Objekten festlegst.

Mal ein noch recht kurz gehaltenes Beispiel die Objektorientierung etwas veranschaulicht und darstellt, wie simpel und lesbar es doch sein kann:

Code:
class Flight
{
    public Flight(string name, Airplane plane)
    {
        Name = name;
        Plane = plane;
    }

    public string Name { get; set; }
    public string Destination { get; set; }
    public Airplane Plane { get; set; }
    public DateTime EstimatedArrival { get; set; }
    public bool Cancelled { get; set; }
    public List<string> Passengers { get; set; } // damit's simpel bleibt: kein Passenger Objekt mit Name, Alter, Haarfarbe, ...
    public int FreeSeats
    {
        get { return (Plane.SeatCount - Passengers.Count); }
    }
}

class Airplane
{
    public Airplane(int seatCount)
    {
        SeatCount = seatCount;
    }

    public int SeatCount { get; set; }
}

int main()
{
    var lufthansaJK1337 = new Airplane(500);


    // ...
    var flights = new List<Flight>()
    {
        new Flight("FL0001", lufthansaJK1337) { Destination = "Mt. Whateverest" },
        new Flight("FL0002", lufthansaJK1337) { Destination = "Berlin" }
    };


    foreach(var flight in flights)
    {
        var seats = flight.FreeSeats;
        if(!seats)
        {
            Console.WriteLine("Sorry aber Flug " + flight.Name + " hat leider keine Sitze mehr frei :(");
            continue;
        }
  
        Console.WriteLine("Flug " + flight.Name + " hat noch " + seats + " freie Sitze, magst' mitfliegen?");
        // ja oder nein?
        // wenn ja
        Console.WriteLine("Sehr gut, wie ist dein Name?");
        // Namen auslesen...
        if(flight.Passengers.Any(passenger => passenger == name)) // nennt sich LINQ, wenn es dich interessiert
        {
            Console.WriteLine("Jo du bist schon eingetragen!");
        }
        else
        {
            flight.Passengers.Add(passengerName);
            Console.WriteLine("Klasse, du bist dabei!");
            break;
        }
    }
}

4. Das mit der Schleifenkonstruktion ist vielleicht auch eher suboptimal. Ich würde eher so etwas bevorzugen:

Code:
Console.WriteLine("Option 1");
// ...
while((var input = Console.ReadLine()) != "exit") // so lange der User nicht exit schreibt, läuft das Teil weiter
{
    if(String.IsNullOrEmpty(input)) continue; // Leere Eingaben überspringen
    // ...
}
5. Auszug aus der Namensgebung von Variablen:

Code:
string[] _resname = res_name.ToArray();
Das ist Mist. Nicht, weil mir die Namensgebung nicht gefällt sondern weil sie ziemlich inkonsistent ist. Mal verwendest_du_Unterstriche_zwischen_Funktionen, mal schreibst du Variablen/Funktionsnamen in CamelCase oder pascalCase, und zwischendurch werden Variablen einfach mal mit einem _führenden Unterstrich benannt.

In der Regel nutzt man (wie in vielen anderen Programmiersprachen auch) Namenskonventionen die konsistent für die einzelnen Elemente eingehalten werden. Natürlich kann man auch davon abweichen, wenn einem CamelCase nicht so gefällt aber prinzipiell soll das alles schon ein gewisses Muster verfolgen.


Sorry für alle Tippfehler, habe das gerade in meiner Python IDE ohne IntelliSense getippt.

PS: Nicht wirklich etwas was mich stört aber wieso nutzt du diese #region und #endregion Tags? Bringen die dir irgendetwas? Ich weiß nur, dass VS diese nutzt um Codesektionen besser strukturieren zu können.

PPS: Das sind alles nur Hinweise auf deinen Programmierstil/den Code. Auf das Ursprungsproblem hatte ich, um ehrlich zu sein, keine Lust, weil das ohnehin noch mehr Zeit gekostet hätte und da du genau dieses Problem sowieso nicht mehr hast wenn du die Vorschläge berücksichtigst, kann man sich das eigentlich sparen. Außerdem hat mein Vorposter dazu etwas geschrieben, vielleicht hat er ja schon die Lösung die du brauchst.
02/25/2015 18:48 Cotigo#4
Quote:
Originally Posted by Dingtax View Post
Der Fehler liegt bei deinen Listen.
Code:
res_flug[0] = "4"  //Beispiel
res_flug[1] = "2"  //Beispiel

flugzeuge[0] = "Flugzeug #1"
flugzeuge[1] = "Flugzeug #2"
flugzeuge[2] = "Flugzeug #3"
flugzeuge[3] = "Flugzeug #4"
Da wir bei flugzeuge[i] == res_flug[z] nie "true" herauskommen ;)

Danke für den Tipp :)
Hab das anscheind vollkommen übersehen und es funktioniert einwandfrei nun.

@Mostey
Auch dir danke ich das du mir die Kritik gibst die ich gebrauchen kann um besser und übersichtlicher zu programmieren :)
Ich werde versuchen das Programm ein wenig mehr OOP zu programmieren und diesen Stil beibehalten.

Thema kann somit geschlossen werden.