Как правильно написать условие для if?
Не получается в if задать проверку данного условия(возможно я не правильно прохожусь if ом по моей коллекции?)
Само задание - "Упорядочить всю последовательность авиалайнеров по возрастанию взлетного веса. При совпадении взлетного веса – упорядочивать данные по номеру рейса."
Вопрос в следующем
Как правильно написать if чтобы он проверил каждый элемент коллекции и если хоть где то есть одинаковый вес (Самолёта,переменная TakeOffWeight), то сразу применял сортировку по номеру (SortByNumber)?
using System.Numerics;
using System.Xml.Serialization;
public enum PlaneType
{
None,
AirbusA310,
AirbusA320,
Boeing731,
Boeing747,
Boeing748,
AirbusA321,
AirbusA322,
}
//Базовый абстрактный класс "Самолет"
[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.AirbusA322] = 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-0006","КрасновАА", 1000));
myAirline.Add(new CargoAircraft(PlaneType.Boeing731, "RF-0005", "КочерыжкинВФ", 500));
myAirline.Add(new PassangerPlane(PlaneType.AirbusA310, "RF-0008", "БулочкинВВ", 110));
myAirline.Add(new CargoAircraft(PlaneType.Boeing748, "RF-0002", "ГрейнсГГ", 500));
myAirline.Add(new PassangerPlane(PlaneType.AirbusA322, "RF-0004", "ЯшкинЯЯ", 130));
myAirline.Add(new CargoAircraft(PlaneType.Boeing747, "RF-0001", "ЩенковФФ", 55));
myAirline.Add(new PassangerPlane(PlaneType.AirbusA321, "RF-0007", "СуворовАА", 100));
const string fileName = @"D:\Airline.xml";
myAirline.ToXml(fileName);
try
{
var myAirlineNew = Airline.FromXml(fileName);
foreach (var plane in myAirline.GetPlanes().ToList())
{
if (plane.TakeOffWeight == plane.TakeOffWeight + 1)
{
myAirline.SortByNumber();
}
else myAirline.SortByWeight();
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}");}
}
}
Ответы (1 шт):
Такое условие всегда будет false. Вы сравниваете сум. вес самолета с сум. весом +1 того же самолета только
Вам нужно что- то на подобии:
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");
}
}
Где пробегаете по всему списку и сравниваете актуальный самолет с предыдущим или следующим.