Не выполняется сортировка по номеру самолёта C#
Не могу понять в чём проблема Вот сам код
using System.Numerics;
using System.Xml.Serialization;
public enum PlaneType
{
None,
AirbusA310,
AirbusA320,
Boeing731,
Boeing747,
Boeing748,
AirbusA321,
AirbusA3222,
}
//Базовый абстрактный класс "Самолет"
[XmlInclude(typeof(PassangerPlane))]
[XmlInclude(typeof(CargoAircraft))]
public abstract class Plane
{
private static readonly Dictionary<PlaneType, double> _emptyWeights =
new Dictionary<PlaneType, double>
{
[PlaneType.AirbusA310] = 100,
[PlaneType.AirbusA320] = 100,
[PlaneType.Boeing731] = 100,
[PlaneType.Boeing747] = 100,
[PlaneType.Boeing748] = 100,
[PlaneType.AirbusA321] = 100,
[PlaneType.AirbusA3222] = 100,
};
protected PlaneType _planeType;
protected double _emptyWeight;
protected Plane() { }
protected Plane(PlaneType type, string number,string fcs)
{
Type = type;
Number = number;
Fcs = fcs;
}
//Тип самолета (определяет вес без груза)
public PlaneType Type
{
get { return _planeType; }
set
{
_planeType = value;
_emptyWeight = _emptyWeights[_planeType];
}
}
//Серийный номер
public string Number { get; set; }
public string Fcs { get; set; }
//Взлетный вес (переопределяется в наследниках)
public abstract double TakeOffWeight { get; }
}
//Пассажирский самолет
public class PassangerPlane : Plane
{
private const double K = 62;
public PassangerPlane() { }
public PassangerPlane(PlaneType type, string number,string fcs, int count)
: base(type, number,fcs)
{
Count = count;
}
public int Count { get; set; }
public override double TakeOffWeight
{
get { return K * Count + _emptyWeight; }
}
}
//Грузовой самолет
public class CargoAircraft : Plane
{
public CargoAircraft() { }
public CargoAircraft(PlaneType type, string number,string fcs, double weight)
:base(type, number,fcs)
{
CargoWeight = weight;
}
//Вес груза
public double CargoWeight { get; set; }
public override double TakeOffWeight
{
get { return CargoWeight + _emptyWeight; }
}
}
public class Airline
{
private readonly List<Plane> _planes = new List<Plane> ();
//Суммарный вес всех самолетов
public double TotalWeight
{
get
{
double weight = 0;
foreach (var plane in _planes)
weight += plane.TakeOffWeight;
return weight;
}
}
//Добавить самолет
public void Add(Plane plane)
{
if(plane == null || plane.Type == PlaneType.None
|| string.IsNullOrEmpty(plane.Number))
{
throw new ArgumentException(nameof(plane));
}
_planes.Add(plane);
}
//Выдать список самолетов
public IEnumerable<Plane> GetPlanes()
{
return _planes;
}
//класс сортировки по весу
private class ByWeightComparer : IComparer<Plane>
{
public int Compare(Plane x,Plane y)
{
return x.TakeOffWeight.CompareTo(y.TakeOffWeight);
}
}
//Отсортировать по взлетному весу
public void SortByWeight()
{
_planes.Sort(new ByWeightComparer());
}
//Сортировка по номеру
private class ByNumberComparer : IComparer<Plane>
{
public int Compare(Plane x, Plane y)
{
return x.Number.CompareTo(y.Number);
}
}
public void SortByNumber()
{
_planes.Sort(new ByNumberComparer());
}
//Сериализовать в XML-файл
public void ToXml(string fileName)
{
var serializer = new XmlSerializer(typeof(List<Plane>));
using (var stream = File.OpenWrite(fileName))
{
serializer.Serialize(stream, _planes);
stream.Flush();
}
}
//Дисериализовать из XML-файла
public static Airline FromXml(string fileName)
{
var airline = new Airline();
var serializer = new XmlSerializer(typeof(List<Plane>));
using (var stream = File.OpenRead(fileName))
{
var planes = serializer.Deserialize(stream) as IEnumerable<Plane>;
if (planes != null) airline._planes.AddRange(planes);
}
return airline;
}
}
public class Program
{
static void Main()
{
var myAirline = new Airline();
myAirline.Add(new PassangerPlane(PlaneType.AirbusA320, "RF-0005", "КрасновАА", 150));
myAirline.Add(new CargoAircraft(PlaneType.Boeing731, "RF-0004", "КочерыжкинВФ", 500));
myAirline.Add(new PassangerPlane(PlaneType.AirbusA310, "RF-0007", "БулочкинВВ", 110));
myAirline.Add(new CargoAircraft(PlaneType.Boeing748, "RF-0002", "ГрейнсГГ", 500));
myAirline.Add(new PassangerPlane(PlaneType.AirbusA3222, "RF-0003", "ЯшкинЯЯ", 140));
myAirline.Add(new CargoAircraft(PlaneType.Boeing747, "RF-0001", "ЩенковФФ", 55));
myAirline.Add(new PassangerPlane(PlaneType.AirbusA321, "RF-0006", "СуворовАА", 100));
const string fileName = @"D:\Airline1.xml";
myAirline.ToXml(fileName);
bool a = true;
while (a)
{
char s = Console.ReadKey().KeyChar;
switch (s)
{
case '0':
try
{
var myAirlineNew = Airline.FromXml(fileName);
var planesList = myAirline.GetPlanes().ToList();
for (int count = 0; count < planesList.Count() - 1; count++)
{
if (planesList[count].TakeOffWeight == planesList[count + 1].TakeOffWeight)
{
myAirline.SortByNumber();
}
else myAirline.SortByWeight();
}
foreach (var plane in myAirline.GetPlanes())
{
Console.WriteLine($"Plane: {plane.Type}" +
$",{plane.Number}" +
$",{plane.Fcs}" +
$",{plane.TakeOffWeight} kg");
}
Console.WriteLine($"\nTotalWeight = {myAirlineNew.TotalWeight}");
}
catch (Exception ex) { Console.WriteLine($"Error: {ex.Message}"); }
break;
case '5':
a = false;
Console.WriteLine("Вы вышли из программы!");
break;
default:
Console.WriteLine("Не правильно,попробуйте ещё раз");
break;
}
}
}
}
Вот если я вывожу список самолётов в консоль с разными весами, то всё сортируется правильно, но как только я сделаю одинаковый вес двум или нескольким самолётам, то программа выводит не отсортированный список.Вроде сортировку по номеру сделал верно.
try
{
var myAirlineNew = Airline.FromXml(fileName);
var planesList = myAirline.GetPlanes().ToList();
for (int count = 0; count < planesList.Count() - 1; count++)
{
if (planesList[count].TakeOffWeight == planesList[count + 1].TakeOffWeight)
{
myAirline.SortByNumber();
}
else myAirline.SortByWeight();
}
foreach (var plane in myAirline.GetPlanes())
{
Console.WriteLine($"Plane: {plane.Type}" +
$",{plane.Number}" +
$",{plane.Fcs}" +
$",{plane.TakeOffWeight} kg");
}
Ответы (1 шт):
Автор решения: Aziz Umarov
→ Ссылка
Может быть надо выходить из цикла (не ясен смысл его конечно) как только отсортировали
for (int count = 0; count < planesList.Count() - 1; count++)
{
if (planesList[count].TakeOffWeight == planesList[count + 1].TakeOffWeight)
{
myAirline.SortByNumber();
break;
}
else
{
myAirline.SortByWeight();
break;
}
}
иначе я так понимаю у вас так и будет без конца сортироваться один и тот же список