Kolekcje generyczne, nieprawidłowe działanie porównania elementów w programie.

0

Chciałem zapytać się czego brakuje w tym kodzie żeby zaczął działać.

 class Car
    {
        public string CarName { get; set; }
        public string OwnerName { get; set; }
        public int MaxSpeed { get; set; }
    }

class SortedCarByMaxSpeed : IComparer<Car>
    {
        public int Compare(Car x , Car y)
        { 
          if (x.MaxSpeed > y.MaxSpeed) return 1; 
          if (x.MaxSpeed < y.MaxSpeed) return -1; else return 0;
        }


    }
    class Program
    {
        static void Main(string[] args)
        {
            SortedSet<Car> cars = new SortedSet<Car>(new SortedCarByMaxSpeed())
            {
                new Car { CarName = "Honda" ,OwnerName = "Wojtek", MaxSpeed = 255 },
                new Car { CarName = "Subaru" ,OwnerName = "Kamil", MaxSpeed = 280 },
                new Car { CarName = "Nissan" , OwnerName = "Michał", MaxSpeed = 290},

            };

            foreach (Car c in cars)
                Console.WriteLine(c);
            Console.Read();
        }
    }
       
       
    }
0

Ja musiałem tylko 3 rzeczy zmienić:
1.

 using System;
 using System.Collections.Generic;
  1. Na końcu dodatkowa klamra (wywal ją)
  2. Console.WriteLine("{0} {1} {2}", c.CarName, c.OwnerName, c.MaxSpeed); zamiast Console.WriteLine(c);

Swoją drogą Twoja funkcja Compare może być troszkę uproszczona:

        public int Compare(Car x, Car y)
        { 
          return x.MaxSpeed - y.MaxSpeed;
        }
0

Ostatnio zakładałeś temat o nadpisywaniu ToString, w tym przypadku mógłbyś tego użyć dla klasy Car.

0

Console.WriteLine("{0} {1} {2}", c.CarName, c.OwnerName, c.MaxSpeed); zamiast Console.WriteLine(c);
Zrobiłem tak ale wyświetla mi teraz te 3 prędkości czyli one chyba nie przechodzą jeszcze przez metodę Compare?, bo nie zwraca mi tam np. 1

Ostatnio zakładałeś temat o nadpisywaniu ToString, w tym przypadku mógłbyś tego użyć dla klasy Car
Zakładałem ale poleciał do kosza ale mniej więcej ogarnąłem ToString. Tylko nie rozumiem do czego miałbym użyć ToString jeżeli metoda compare pobiera i zwraca int. ?

0
foreach (Car c in cars)
         Console.WriteLine(c); 

A myślisz, że co to wypisze?

1

A czemu ma zwracać 1?
Metoda Compare jest wykorzystywana tylko aby posortować kolekcję.

@RideorDie SoretedSet sam wywołuje Compare. Spróbuj dodać te obiekty w innej kolejności i dopiero wypisać.
Możesz jeszcze też w metodzie

public int Compare(Car x , Car y)
        {
            Console.WriteLine("Odpalono Compare");
          return x.MaxSpeed - y.MaxSpeed;
        }
0

Ogólnie to SortedSet w takim przypadku to kiepskie rozwiązanie.
Jak z tym komparatorem spróbujesz dodać 2 samochody z taką samą predkością MaxSpeed to niestety, ale drugiego już nie dodasz.

1

zamiast zewnętrznego komparatora możesz zaimplementować interfejs IComparable wewnątrz klasy

class Car : IComparable<Car>
{
    public string CarName { get; set; }
    public string OwnerName { get; set; }
    public int MaxSpeed { get; set; }

    public int CompareTo(Car other)
    {
        return this.MaxSpeed - other.MaxSpeed;
    }
}

wtedy nie musisz podawać dodatkowo komparatora w konstruktorze SortedSet

idąc dalej w ogóle nie musisz mieć komparatora, możesz skorzystać z dowolnej kolekcji (niekoniecznie sortedset) a następnie przy użyciu linq posortować przy wyświetlaniu:

        foreach (Car c in cars.OrderBy(x => x.MaxSpeed))
            Console.WriteLine(c.CarName);

w rzeczywistym użyciu oczywiście wszystko zależy od intencji, sortedset w tym przykładzie jest bez sensu ale w innym może już nie być

0
public int Compare(Car x , Car y)
        { 
          if (x.MaxSpeed > y.MaxSpeed) return 1; 
          if (x.MaxSpeed < y.MaxSpeed) return -1; else return 0;
        }

Tu na pewno brakuje czytelności.

1 użytkowników online, w tym zalogowanych: 0, gości: 1