From 0819e80cec77e3efb5ca1fe78eb2ab6447b87006 Mon Sep 17 00:00:00 2001 From: urlilpolly Date: Sun, 24 Dec 2023 20:11:39 +0400 Subject: [PATCH] laba8 --- RPP/RPP/AirbusCollectionInfo.cs | 31 ++++++++++++ RPP/RPP/AirbusCompareByColor.cs | 39 +++++++++++++++ RPP/RPP/AirbusCompareByType.cs | 34 +++++++++++++ RPP/RPP/AirbusGenericCollection.cs | 4 +- RPP/RPP/AirbusGenericStorage.cs | 27 +++++----- RPP/RPP/DrawiningAirbusEqutables .cs | 63 ++++++++++++++++++++++++ RPP/RPP/FormAirbusCollection.Designer.cs | 40 ++++++++++++--- RPP/RPP/FormAirbusCollection.cs | 20 +++++++- RPP/RPP/SetGeneric.cs | 16 ++++-- 9 files changed, 248 insertions(+), 26 deletions(-) create mode 100644 RPP/RPP/AirbusCollectionInfo.cs create mode 100644 RPP/RPP/AirbusCompareByColor.cs create mode 100644 RPP/RPP/AirbusCompareByType.cs create mode 100644 RPP/RPP/DrawiningAirbusEqutables .cs diff --git a/RPP/RPP/AirbusCollectionInfo.cs b/RPP/RPP/AirbusCollectionInfo.cs new file mode 100644 index 0000000..5d327df --- /dev/null +++ b/RPP/RPP/AirbusCollectionInfo.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using RPP.DrawningObjects; +using RPP.Generics; + +namespace RPP +{ + internal class AirbusCollectionInfo : IEquatable + { + public string Name { get; private set; } + public string Description { get; private set; } + public AirbusCollectionInfo(string name, string description) + { + Name = name; + Description = description; + } + public bool Equals(AirbusCollectionInfo? other) + { + if (other == null || Name == null || other.Name == null) return false; + if (Name == other.Name) return true; + throw new NotImplementedException(); + } + public override int GetHashCode() + { + return Name?.GetHashCode() ?? 0; + } + } +} diff --git a/RPP/RPP/AirbusCompareByColor.cs b/RPP/RPP/AirbusCompareByColor.cs new file mode 100644 index 0000000..30ef205 --- /dev/null +++ b/RPP/RPP/AirbusCompareByColor.cs @@ -0,0 +1,39 @@ +using RPP.DrawningObjects; +using RPP.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RPP +{ + internal class AirbusCompareByColor : IComparer + { + public int Compare(DrawningAirbus? x, DrawningAirbus? y) + { + if (x == null || x._EntityAirbus == null) + { + throw new ArgumentNullException(nameof(x)); + } + if (y == null || y._EntityAirbus == null) + { + throw new ArgumentNullException(nameof(y)); + } + if (x._EntityAirbus.BodyColor != y._EntityAirbus.BodyColor) + { + return x._EntityAirbus.BodyColor.Name.CompareTo(y._EntityAirbus.BodyColor.Name); + } + if (x.GetType() == y.GetType() && x is DrawningFlyAirbus) + { + return (x._EntityAirbus as EntityFlyAirbus).AdditionalColor.Name.CompareTo((y._EntityAirbus as EntityFlyAirbus).AdditionalColor.Name); + } + var speedCompare = x._EntityAirbus.Speed.CompareTo(y._EntityAirbus.Speed); + if (speedCompare != 0) + { + return speedCompare; + } + return x._EntityAirbus.Weight.CompareTo(y._EntityAirbus.Weight); + } + } +} diff --git a/RPP/RPP/AirbusCompareByType.cs b/RPP/RPP/AirbusCompareByType.cs new file mode 100644 index 0000000..ff79cfc --- /dev/null +++ b/RPP/RPP/AirbusCompareByType.cs @@ -0,0 +1,34 @@ +using RPP.DrawningObjects; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RPP +{ + internal class AirbusCompareByType : IComparer + { + public int Compare(DrawningAirbus? x, DrawningAirbus? y) + { + if (x == null || x._EntityAirbus == null) + { + throw new ArgumentNullException(nameof(x)); + } + if (y == null || y._EntityAirbus == null) + { + throw new ArgumentNullException(nameof(y)); + } + if (x.GetType().Name != y.GetType().Name) + { + return x.GetType().Name.CompareTo(y.GetType().Name); + } + var speedCompare = x._EntityAirbus.Speed.CompareTo(y._EntityAirbus.Speed); + if (speedCompare != 0) + { + return speedCompare; + } + return x._EntityAirbus.Weight.CompareTo(y._EntityAirbus.Weight); + } + } +} diff --git a/RPP/RPP/AirbusGenericCollection.cs b/RPP/RPP/AirbusGenericCollection.cs index 8ae67a9..3728db7 100644 --- a/RPP/RPP/AirbusGenericCollection.cs +++ b/RPP/RPP/AirbusGenericCollection.cs @@ -33,7 +33,7 @@ namespace RPP.Generics { return false; } - return (bool)collect?._collection.Insert(obj); + return (bool)collect?._collection.Insert(obj, new DrawiningAirbusEqutables()); } public static T? operator -(AirbusGenericCollection collect, int @@ -47,7 +47,7 @@ namespace RPP.Generics return obj; } - + public void Sort(IComparer comparer) => _collection.SortSet(comparer); public U? GetU(int pos) { diff --git a/RPP/RPP/AirbusGenericStorage.cs b/RPP/RPP/AirbusGenericStorage.cs index f50ba23..c272312 100644 --- a/RPP/RPP/AirbusGenericStorage.cs +++ b/RPP/RPP/AirbusGenericStorage.cs @@ -5,15 +5,16 @@ using System.Text; using System.Threading.Tasks; using RPP.MovementStrategy; using RPP.DrawningObjects; +using System.Xml.Linq; namespace RPP.Generics { internal class AirbusGenericStorage { - readonly Dictionary> _airbusStorages; + readonly Dictionary> _airbusStorages; - public List Keys => _airbusStorages.Keys.ToList(); + public List Keys => _airbusStorages.Keys.ToList(); private readonly int _pictureWidth; @@ -21,23 +22,25 @@ namespace RPP.Generics public AirbusGenericStorage(int pictureWidth, int pictureHeight) { - _airbusStorages = new Dictionary>(); + _airbusStorages = new Dictionary>(); _pictureWidth = pictureWidth; _pictureHeight = pictureHeight; } public void AddSet(string name) { - if (_airbusStorages.ContainsKey(name)) + AirbusCollectionInfo Info = new AirbusCollectionInfo(name, string.Empty); + if (_airbusStorages.ContainsKey(Info)) return; - _airbusStorages[name] = new AirbusGenericCollection(_pictureWidth, _pictureHeight); + _airbusStorages[Info] = new AirbusGenericCollection(_pictureWidth, _pictureHeight); } public void DelSet(string name) { - if (!_airbusStorages.ContainsKey(name)) + AirbusCollectionInfo Info = new AirbusCollectionInfo(name, string.Empty); + if (!_airbusStorages.ContainsKey(Info)) return; - _airbusStorages.Remove(name); + _airbusStorages.Remove(Info); } public AirbusGenericCollection @@ -45,8 +48,8 @@ namespace RPP.Generics { get { - if (_airbusStorages.ContainsKey(ind)) - return _airbusStorages[ind]; + AirbusCollectionInfo Info = new AirbusCollectionInfo(ind, string.Empty); + if (_airbusStorages.ContainsKey(Info)) return _airbusStorages[Info]; return null; } } @@ -62,14 +65,14 @@ namespace RPP.Generics File.Delete(filename); } StringBuilder data = new(); - foreach (KeyValuePair> record in _airbusStorages) + foreach (KeyValuePair> record in _airbusStorages) { StringBuilder records = new(); foreach (DrawningAirbus? elem in record.Value.GetAirbus) { records.Append($"{elem?.GetDataForSave(_separatorForObject)}{_separatorRecords}"); } - data.AppendLine($"{record.Key}{_separatorForKeyValue}{records}"); + data.AppendLine($"{record.Key.Name}{_separatorForKeyValue}{records}"); } if (data.Length == 0) @@ -125,7 +128,7 @@ namespace RPP.Generics } } } - _airbusStorages.Add(name, collection); + _airbusStorages.Add(new AirbusCollectionInfo(name, string.Empty), collection); } } } diff --git a/RPP/RPP/DrawiningAirbusEqutables .cs b/RPP/RPP/DrawiningAirbusEqutables .cs new file mode 100644 index 0000000..cdb5712 --- /dev/null +++ b/RPP/RPP/DrawiningAirbusEqutables .cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using RPP.Entities; +using RPP.DrawningObjects; +using System.Diagnostics.CodeAnalysis; + +namespace RPP +{ + internal class DrawiningAirbusEqutables : IEqualityComparer + { + public bool Equals(DrawningAirbus? x, DrawningAirbus? y) + { + if (x == null || x._EntityAirbus == null) + { + throw new ArgumentNullException(nameof(x)); + } + if (y == null || y._EntityAirbus == null) + { + throw new ArgumentNullException(nameof(y)); + } + if (x.GetType() != y.GetType()) + { + return false; + } + if (x._EntityAirbus.Speed != y._EntityAirbus.Speed) + { + return false; + } + if (x._EntityAirbus.Weight != y._EntityAirbus.Weight) + { + return false; + } + if (x._EntityAirbus.BodyColor != y._EntityAirbus.BodyColor) + { + return false; + } + if (x is DrawningFlyAirbus && y is DrawningFlyAirbus) + { + if ((x._EntityAirbus as EntityFlyAirbus).AdditionalColor != (y._EntityAirbus as EntityFlyAirbus).AdditionalColor) + { + return false; + } + if ((x._EntityAirbus as EntityFlyAirbus).Compartment != (y._EntityAirbus as EntityFlyAirbus).Compartment) + { + return false; + } + if ((x._EntityAirbus as EntityFlyAirbus).Engine != (y._EntityAirbus as EntityFlyAirbus).Engine) + { + return false; + } + } + return true; + } + + public int GetHashCode([DisallowNull] DrawningAirbus obj) + { + return obj.GetHashCode(); + } + } +} diff --git a/RPP/RPP/FormAirbusCollection.Designer.cs b/RPP/RPP/FormAirbusCollection.Designer.cs index 03808de..8430db9 100644 --- a/RPP/RPP/FormAirbusCollection.Designer.cs +++ b/RPP/RPP/FormAirbusCollection.Designer.cs @@ -29,6 +29,8 @@ private void InitializeComponent() { panel1 = new Panel(); + ButtonSortByColor = new Button(); + ButtonSortByType = new Button(); panel2 = new Panel(); buttonDelObject = new Button(); listBoxStorages = new ListBox(); @@ -55,6 +57,8 @@ // // panel1 // + panel1.Controls.Add(ButtonSortByColor); + panel1.Controls.Add(ButtonSortByType); panel1.Controls.Add(panel2); panel1.Controls.Add(ButtonRefreshCollection); panel1.Controls.Add(ButtonRemoveAirbus); @@ -64,9 +68,29 @@ panel1.Dock = DockStyle.Right; panel1.Location = new Point(597, 0); panel1.Name = "panel1"; - panel1.Size = new Size(203, 450); + panel1.Size = new Size(203, 556); panel1.TabIndex = 0; // + // ButtonSortByColor + // + ButtonSortByColor.Location = new Point(16, 307); + ButtonSortByColor.Name = "ButtonSortByColor"; + ButtonSortByColor.Size = new Size(172, 29); + ButtonSortByColor.TabIndex = 8; + ButtonSortByColor.Text = "Соритровка по цвету"; + ButtonSortByColor.UseVisualStyleBackColor = true; + ButtonSortByColor.Click += ButtonSortByColor_Click; + // + // ButtonSortByType + // + ButtonSortByType.Location = new Point(16, 262); + ButtonSortByType.Name = "ButtonSortByType"; + ButtonSortByType.Size = new Size(172, 29); + ButtonSortByType.TabIndex = 7; + ButtonSortByType.Text = "Сортировка по типу"; + ButtonSortByType.UseVisualStyleBackColor = true; + ButtonSortByType.Click += ButtonSortByType_Click; + // // panel2 // panel2.Controls.Add(buttonDelObject); @@ -136,7 +160,7 @@ // // ButtonRefreshCollection // - ButtonRefreshCollection.Location = new Point(7, 398); + ButtonRefreshCollection.Location = new Point(6, 504); ButtonRefreshCollection.Name = "ButtonRefreshCollection"; ButtonRefreshCollection.Size = new Size(190, 40); ButtonRefreshCollection.TabIndex = 4; @@ -146,7 +170,7 @@ // // ButtonRemoveAirbus // - ButtonRemoveAirbus.Location = new Point(5, 327); + ButtonRemoveAirbus.Location = new Point(5, 424); ButtonRemoveAirbus.Name = "ButtonRemoveAirbus"; ButtonRemoveAirbus.Size = new Size(190, 40); ButtonRemoveAirbus.TabIndex = 3; @@ -156,14 +180,14 @@ // // maskedTextBoxNumber // - maskedTextBoxNumber.Location = new Point(40, 298); + maskedTextBoxNumber.Location = new Point(55, 395); maskedTextBoxNumber.Name = "maskedTextBoxNumber"; maskedTextBoxNumber.Size = new Size(98, 23); maskedTextBoxNumber.TabIndex = 2; // // AddAirbusButton // - AddAirbusButton.Location = new Point(5, 252); + AddAirbusButton.Location = new Point(6, 349); AddAirbusButton.Name = "AddAirbusButton"; AddAirbusButton.Size = new Size(190, 40); AddAirbusButton.TabIndex = 1; @@ -207,7 +231,7 @@ pictureBoxCollection.Dock = DockStyle.Fill; pictureBoxCollection.Location = new Point(0, 0); pictureBoxCollection.Name = "pictureBoxCollection"; - pictureBoxCollection.Size = new Size(597, 450); + pictureBoxCollection.Size = new Size(597, 556); pictureBoxCollection.TabIndex = 1; pictureBoxCollection.TabStop = false; // @@ -223,7 +247,7 @@ // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(800, 450); + ClientSize = new Size(800, 556); Controls.Add(pictureBoxCollection); Controls.Add(panel1); MainMenuStrip = menuStrip; @@ -261,5 +285,7 @@ private ToolStripMenuItem menuToolStripMenuItem; private ToolStripMenuItem SaveToolStripMenuItem; private ToolStripMenuItem LoadToolStripMenuItem; + private Button ButtonSortByColor; + private Button ButtonSortByType; } } \ No newline at end of file diff --git a/RPP/RPP/FormAirbusCollection.cs b/RPP/RPP/FormAirbusCollection.cs index 25448c8..bb8dc57 100644 --- a/RPP/RPP/FormAirbusCollection.cs +++ b/RPP/RPP/FormAirbusCollection.cs @@ -1,6 +1,7 @@ using RPP.DrawningObjects; using RPP.Generics; using Microsoft.Extensions.Logging; +using System.Drawing.Text; namespace RPP { @@ -38,6 +39,11 @@ namespace RPP pictureBoxCollection.Image = obj.ShowCars(); _logger.LogInformation($"Добавлен объект в набор {listBoxStorages.SelectedItem.ToString()}"); } + catch (ArgumentException ex) + { + MessageBox.Show("Такой объект уже существует"); + _logger.LogWarning($"{ex.Message} в наборе {listBoxStorages.SelectedItem.ToString()}"); + } catch (Exception ex) { MessageBox.Show("Не удалось добавить объект"); @@ -66,7 +72,7 @@ namespace RPP listBoxStorages.Items.Clear(); foreach (var key in _storage.Keys) { - listBoxStorages.Items.Add(key); + listBoxStorages.Items.Add(key.Name); } if (listBoxStorages.Items.Count > 0 && (index == -1 || index >= listBoxStorages.Items.Count)) @@ -201,5 +207,17 @@ namespace RPP } } } + private void ButtonSortByType_Click(object sender, EventArgs e) => CompareAirbus(new AirbusCompareByType()); + private void ButtonSortByColor_Click(object sender, EventArgs e) => CompareAirbus(new AirbusCompareByColor()); + private void CompareAirbus(IComparer comparer) + { + if (listBoxStorages.SelectedIndex == -1) + return; + var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty]; + if (obj == null) + return; + obj.Sort(comparer); + pictureBoxCollection.Image = obj.ShowCars(); + } } } diff --git a/RPP/RPP/SetGeneric.cs b/RPP/RPP/SetGeneric.cs index d12f677..4521054 100644 --- a/RPP/RPP/SetGeneric.cs +++ b/RPP/RPP/SetGeneric.cs @@ -19,12 +19,12 @@ namespace RPP.Generics _places = new List(_maxCount); } - public bool Insert(T airbus) + public bool Insert(T airbus, IEqualityComparer? equal = null) { - return Insert(airbus, 0); + return Insert(airbus, 0, equal); } - public bool Insert(T airbus, int position) + public bool Insert(T airbus, int position, IEqualityComparer? equal = null) { if (position < 0 || position >= _maxCount) @@ -35,7 +35,14 @@ namespace RPP.Generics { throw new StorageOverflowException(position); } - + if (equal != null) + { + foreach (var i in _places) + { + if (equal.Equals(i, airbus)) + throw new ArgumentException($"Объект {airbus} уже существует"); + } + } _places.Insert(0, airbus); return true; } @@ -79,6 +86,7 @@ namespace RPP.Generics } } } + public void SortSet(IComparer comparer) => _places.Sort(comparer); } } -- 2.25.1