Hunderasse ermitteln mit Konsolenanwendung


Paludis

Grünschnabel
Ich habe da eine kleine Konsolenanwendung bei der ich folgendes Problem habe:

Und zwar kann man Eigenschaften von Hunden wie zum Beispiel Anpassungsfähigkeit, Freundlichkeit und so weiter von 1 bis 5 ordnen (die Eigenschaft, der man die 1 zuweist, wäre dann die wichtigste Eigenschaft) und dann eine Grösse auswählen. Die Anwendung spuckt dann jedoch lediglich die Hunderassen anhand der Eigenschaft mit der 1 und der gewählten Grösse aus (im Moment ist die Anwendung so programmiert).
Ich möchte jedoch, dass er für alle Möglichkeiten ein Resultat ausspuckt.

Also zum Beispiel möchte ich, dass er bei einem Beispiel von:

Anpassungsfähigkeit = 1
Freundlichkeit = 2
Generelle Gesundheit = 3
Trainierbarkeit = 4
Energie = 5

die alle Eigenschaften von 1 bis 5 miteinander vergleicht und dann nur die Rassen ausgibt, auf die das auch zutrifft. Also bei diesem Beispiel soll er die Hunde anzeigen, die sehr Anpassungsfähig sind, sehr freundlich, allgemein relativ gesund, einigermassen trainierbar und nicht so viel Energie haben wie andere.

Code:

C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DogBreedSelectorConsole
{
    class SelectorLogic
    {
        public static void FindDogs()
        {
            Console.WriteLine("Hello! This is the dog breed selector, I'm here to help you find your next dog!\n");

            Console.WriteLine("There are 5 main characteristics:\n");
            Console.WriteLine("Adaptability to difficult and/or new situations | All around friendliness and \naffection with family | General Health | Intelligence and trainabilty\n| Exercise needs and energy level");
            Console.WriteLine();
            Console.WriteLine("Please tell me your most important characteristics by ordering them from one to five (1 is most important and 5 is least important).");
            Console.WriteLine("I will also want to know which size you prefer.");
            Console.WriteLine();
            Console.WriteLine();
            Console.Write("Adaptability (from 1 to 5): ");

            int adaptability = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine();
            Console.Write("All around affection and friendliness: ");

            int friendliness = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine();
            Console.Write("General Health: ");

            int health = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine();
            Console.Write("Trainability and intelligence: ");

            int trainability = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine();
            Console.Write("Exercise needs and energy: ");

            int energy = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine();
            Console.Write("Size? Small, middle or big? ");

            string size = Console.ReadLine();

            Console.WriteLine();

            Console.WriteLine("\nExample: Race, Lifespan, Friendliness, Adaptability,\nEnergy, Health, Size, Trainability and Weight");

            var dogs = new DogBreed().AllBreeds();

            if (adaptability == 1 && (size == "Small" || size == "small"))
            {
                var adaptableSmallDogs = dogs.FindAll(dog => dog.Adaptability >= 4 && dog.Size <= 30);

                Console.WriteLine();
                foreach (var dog in adaptableSmallDogs)
                {
                    Console.WriteLine(dog.Race);
                }
            }
            else if (adaptability == 1 && (size == "Middle" || size == "middle"))
            {
                var adaptableMiddleDogs = dogs.FindAll(dog => dog.Adaptability >= 4 && (dog.Size >= 31 && dog.Size < 55));

                Console.WriteLine();
                foreach (var dog in adaptableMiddleDogs)
                {
                    Console.WriteLine(dog.Race);
                }
            }
            else if (adaptability == 1 && (size == "Big" || size == "big"))
            {
                var adaptableBigDogs = dogs.FindAll(dog => dog.Adaptability >= 4 && dog.Size >= 55);

                Console.WriteLine();
                foreach (var dog in adaptableBigDogs)
                {
                    Console.WriteLine(dog.Race);
                }
            }

            else if (friendliness == 1 && (size == "Small" || size == "small"))
            {
                var friendlySmallDogs = dogs.FindAll(dog => dog.Friendliness == 5 && dog.Size <= 30);

                Console.WriteLine();
                foreach (var dog in friendlySmallDogs)
                {
                    Console.WriteLine(dog.Race);
                }
            }
            else if (friendliness == 1 && (size == "Middle" || size == "middle"))
            {
                var friendlyMiddleDogs = dogs.FindAll(dog => dog.Friendliness == 5 && (dog.Size >= 31 && dog.Size < 55));

                Console.WriteLine();
                foreach (var dog in friendlyMiddleDogs)
                {
                    Console.WriteLine(dog.Race);
                }
            }
            else if (friendliness == 1 && (size == "Big" || size == "big"))
            {
                var friendlyBigDogs = dogs.FindAll(dog => dog.Friendliness == 5 && dog.Size >= 55);

                Console.WriteLine();
                foreach (var dog in friendlyBigDogs)
                {
                    Console.WriteLine(dog.Race);
                }
            }

            else if (health == 1 && (size == "Small" || size == "small"))
            {
                var healthySmallDogs = dogs.FindAll(dog => dog.Health == 5);

                Console.WriteLine();
                foreach (var dog in healthySmallDogs)
                {
                    Console.WriteLine(dog.Race);
                }
            }
            else if (health == 1 && (size == "Middle" || size == "middle"))
            {
                var healthyMiddleDogs = dogs.FindAll(dog => dog.Health == 5 && dog.Size <= 30);

                Console.WriteLine();
                foreach (var dog in healthyMiddleDogs)
                {
                    Console.WriteLine(dog.Race);
                }
            }
            else if (health == 1 && (size == "Big" || size == "middle"))
            {
                var healthyBigDogs = dogs.FindAll(dog => dog.Health == 5 && (dog.Size >= 31 && dog.Size < 55));

                Console.WriteLine();
                foreach (var dog in healthyBigDogs)
                {
                    Console.WriteLine(dog.Race);
                }
            }

            else if (trainability == 1 && (size == "Small" || size == "small"))
            {
                var trainableSmallDogs = dogs.FindAll(dog => dog.Trainability == 5 && dog.Size <= 30);

                Console.WriteLine();
                foreach (var dog in trainableSmallDogs)
                {
                    Console.WriteLine(dog.Race);
                }
            }
            else if (trainability == 1 && (size == "Middle" || size == "middle"))
            {
                var trainableMiddleDogs = dogs.FindAll(dog => dog.Trainability == 5 && (dog.Size >= 31 && dog.Size < 55));

                Console.WriteLine();
                foreach (var dog in trainableMiddleDogs)
                {
                    Console.WriteLine(dog.Race);
                }
            }
            else if (trainability == 1 && (size == "Big" || size == "big"))
            {
                var trainableBigDogs = dogs.FindAll(dog => dog.Trainability == 5 && dog.Size >= 55);

                Console.WriteLine();
                foreach (var dog in trainableBigDogs)
                {
                    Console.WriteLine(dog.Race);
                }
            }

            else if (energy == 1 && (size == "Small" || size == "small"))
            {
                var energeticSmallDogs = dogs.FindAll(dog => dog.Energy == 5 && dog.Energy <= 30);

                Console.WriteLine();
                foreach (var dog in energeticSmallDogs)
                {
                    Console.WriteLine(dog.Race);
                }
            }
            else if (energy == 1 && (size == "Middle" || size == "middle"))
            {
                var energeticMiddleDogs = dogs.FindAll(dog => dog.Energy == 5 && (dog.Size >= 31 && dog.Size < 55));

                Console.WriteLine();
                foreach (var dog in energeticMiddleDogs)
                {
                    Console.WriteLine(dog.Race);
                }
            }
            else if (energy == 1 && (size == "Big" || size == "big"))
            {
                var energeticBigDogs = dogs.FindAll(dog => dog.Energy == 5 && dog.Size >= 55);

                Console.WriteLine();
                foreach (var dog in energeticBigDogs)
                {
                    Console.WriteLine(dog.Race);
                }
            }
        }
    }
}
 

ComFreek

Mod | @comfreek
Moderator
Hallo!

wie sind denn die Hunde in new DogBreed().AllBreeds gespeichert? Ich verstehe nicht, warum du in Zeile 59 nach Hunden filterst mit dog.Adaptability >= 4, wobei der Nutzer jedoch dafür eine 1 eingegeben hat. Meint dog.Adaptability etwa semantisch etwas Anderes als die Nutzereingabe dafür?

Ich würde dir auch vorschlagen, die vielzahligen Duplikate in deinem Code zu eliminieren (-> DRY-Prinzip). Zum Beispiel könntest du das Mapping von "small"/"middle"/"big" auf das entsprechende Größenintervall wie folgt realisieren:
C#:
// Dies soll ein Dictionary sein (JS Syntax), ich kenn mich mit C# nicht aus ;)
var sizes = {
  "small": [0, 30],
  "middle": [31, 54],
  "big": [55, Double.Infinity]
};

// size ist das, was der Nutzer eingegeben hat
// Wir greifen nun auf das Dictionary zu und extrahieren gleich die untere und obere Grenze aus dem resultierenden Array in lowerSize und upperSize
[lowerSize, upperSize] = sizes[size.toLowerCase()];
Um nun alle Hunde zu finden, die genau den Anforderungen entsprechen, erweiterst du deine Bedingungsabfrage:
C#:
dogs.FindAll(dog => dog.Health == health && dog.Trainability == trainability && dog.Adaptability == adaptability && dog.Friendliness == friendliness && (lowerSize <= dog.Size && dog.Size <= upperSize))