Залил лаб 8

This commit is contained in:
ujijrujijr 2023-12-15 19:59:40 +04:00
parent 411f72dd2a
commit cf861f3471
8 changed files with 305 additions and 30 deletions

View File

@ -0,0 +1,51 @@
using System;
using System.Collections.Generic;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Trolleybus.DrawingObjects;
using Trolleybus.Entities;
namespace Trolleybus.Generics
{
internal class BusCompareByColor : IComparer<DrawingBus?>
{
public int Compare(DrawingBus? x, DrawingBus? y)
{
if (x == null || x.EntityBus == null)
{
throw new ArgumentNullException(nameof(x));
}
if (y == null || y.EntityBus == null)
{
throw new ArgumentNullException(nameof(y));
}
var bodyColorCompare = x.EntityBus.BodyColor.Name.CompareTo(y.EntityBus.BodyColor.Name);
// Если оба объекта простые или разных типов (т.е. хотя бы 1 непродвинутый), то сравнение по основному цвету
if (!(x.GetType().Name == "DrawingTrolleybus" && y.GetType().Name == "DrawingTrolleybus"))
{
return bodyColorCompare;
}
// Если оба объекта продвинутые
else
{
EntityTrolleybus entityX = (EntityTrolleybus)x.EntityBus;
EntityTrolleybus entityY = (EntityTrolleybus)y.EntityBus;
// Если основные цвета одинаковые, сравнение по доп. цвету
if (bodyColorCompare == 0)
{
return entityX.AdditionalColor.Name.CompareTo(entityY.AdditionalColor.Name);
}
// иначе сравнение по основному цвету
return bodyColorCompare;
}
}
}
}

View File

@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Trolleybus.DrawingObjects;
namespace Trolleybus.Generics
{
internal class BusCompareByType : IComparer<DrawingBus?>
{
public int Compare(DrawingBus? x, DrawingBus? y)
{
if (x == null || x.EntityBus == null)
{
throw new ArgumentNullException(nameof(x));
}
if (y == null || y.EntityBus == null)
{
throw new ArgumentNullException(nameof(y));
}
// Сравнение по типу (простой / продвинутый)
if (x.GetType().Name != y.GetType().Name)
{
return x.GetType().Name.CompareTo(y.GetType().Name);
}
// Сравнение по скорости
var speedCompare = x.EntityBus.Speed.CompareTo(y.EntityBus.Speed);
if (speedCompare != 0)
{
return speedCompare;
}
// Сравнение по весу
return x.EntityBus.Weight.CompareTo(y.EntityBus.Weight);
}
}
}

View File

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Trolleybus.Generics
{
internal class BusesCollectionInfo : IEquatable<BusesCollectionInfo>
{
public string Name { get; private set; }
public string Description { get; private set; }
public BusesCollectionInfo(string name, string description)
{
Name = name;
Description = description;
}
public bool Equals(BusesCollectionInfo? other)
{
return Name == other.Name;
}
public override int GetHashCode()
{
return this.Name.GetHashCode();
}
}
}

View File

@ -50,6 +50,13 @@ namespace Trolleybus.Generics
_pictureHeight = picHeight; _pictureHeight = picHeight;
_collection = new SetGeneric<T>(width * height); //width*height - кол-во мест на PictureBox для автобусов; размер массива _collection = new SetGeneric<T>(width * height); //width*height - кол-во мест на PictureBox для автобусов; размер массива
} }
/// <summary>
/// Сортировка
/// </summary>
/// <param name="comparer"></param>
public void Sort(IComparer<T?> comparer) => _collection.SortSet(comparer);
/// <summary> /// <summary>
/// Перегрузка оператора сложения /// Перегрузка оператора сложения
/// </summary> /// </summary>
@ -63,7 +70,7 @@ namespace Trolleybus.Generics
{ {
return -1; return -1;
} }
return collect._collection.Insert(obj); return collect._collection.Insert(obj, new DrawingBusEquality());
} }
/// <summary> /// <summary>
/// Перегрузка оператора вычитания /// Перегрузка оператора вычитания

View File

@ -15,12 +15,12 @@ namespace Trolleybus.Generics
/// <summary> /// <summary>
/// Словарь (хранилище) /// Словарь (хранилище)
/// </summary> /// </summary>
readonly Dictionary<string, BusesGenericCollection<DrawingBus, DrawingObjectBus>> _busStorages; readonly Dictionary<BusesCollectionInfo, BusesGenericCollection<DrawingBus, DrawingObjectBus>> _busStorages;
/// <summary> /// <summary>
/// Возвращение списка названий наборов /// Возвращение списка названий наборов
/// </summary> /// </summary>
public List<string> Keys => _busStorages.Keys.ToList(); public List<BusesCollectionInfo> Keys => _busStorages.Keys.ToList();
/// <summary> /// <summary>
/// Ширина окна отрисовки /// Ширина окна отрисовки
@ -52,7 +52,7 @@ namespace Trolleybus.Generics
/// <param name="pictureHeight"></param> /// <param name="pictureHeight"></param>
public BusesGenericStorage(int pictureWidth, int pictureHeight) public BusesGenericStorage(int pictureWidth, int pictureHeight)
{ {
_busStorages = new Dictionary<string, BusesGenericCollection<DrawingBus, DrawingObjectBus>>(); _busStorages = new Dictionary<BusesCollectionInfo, BusesGenericCollection<DrawingBus, DrawingObjectBus>>();
_pictureWidth = pictureWidth; _pictureWidth = pictureWidth;
_pictureHeight = pictureHeight; _pictureHeight = pictureHeight;
} }
@ -63,13 +63,14 @@ namespace Trolleybus.Generics
/// <param name="name">Название набора</param> /// <param name="name">Название набора</param>
public void AddSet(string name) public void AddSet(string name)
{ {
BusesCollectionInfo currentCollectionInfo = new BusesCollectionInfo(name, string.Empty);
// проверка, существует ли набор с таким ключём // проверка, существует ли набор с таким ключём
if (_busStorages.ContainsKey(name)) if (_busStorages.ContainsKey(currentCollectionInfo))
{ {
return; return;
} }
var busCollection = new BusesGenericCollection<DrawingBus, DrawingObjectBus>(_pictureWidth, _pictureHeight); var busCollection = new BusesGenericCollection<DrawingBus, DrawingObjectBus>(_pictureWidth, _pictureHeight);
_busStorages.Add(name, busCollection); _busStorages.Add(currentCollectionInfo, busCollection);
} }
/// <summary> /// <summary>
@ -78,9 +79,10 @@ namespace Trolleybus.Generics
/// <param name="name">Название набора</param> /// <param name="name">Название набора</param>
public void DelSet(string name) public void DelSet(string name)
{ {
if (_busStorages.ContainsKey(name)) BusesCollectionInfo currentCollectionInfo = new BusesCollectionInfo(name, string.Empty);
if (_busStorages.ContainsKey(currentCollectionInfo))
{ {
_busStorages.Remove(name); _busStorages.Remove(currentCollectionInfo);
} }
} }
/// <summary> /// <summary>
@ -92,11 +94,12 @@ namespace Trolleybus.Generics
{ {
get get
{ {
if (!_busStorages.ContainsKey(ind)) BusesCollectionInfo currentCollectionInfo = new BusesCollectionInfo(ind, string.Empty);
if (!_busStorages.ContainsKey(currentCollectionInfo))
{ {
return null; return null;
} }
return _busStorages[ind]; return _busStorages[currentCollectionInfo];
} }
} }
/// <summary> /// <summary>
@ -112,14 +115,14 @@ namespace Trolleybus.Generics
} }
StringBuilder data = new(); StringBuilder data = new();
foreach (KeyValuePair<string, BusesGenericCollection<DrawingBus, DrawingObjectBus>> record in _busStorages) foreach (KeyValuePair<BusesCollectionInfo, BusesGenericCollection<DrawingBus, DrawingObjectBus>> record in _busStorages)
{ {
StringBuilder records = new(); StringBuilder records = new();
foreach (DrawingBus? elem in record.Value.GetBuses) foreach (DrawingBus? elem in record.Value.GetBuses)
{ {
records.Append($"{elem?.GetDataForSave(_separatorForObject)}{_separatorRecords}"); records.Append($"{elem?.GetDataForSave(_separatorForObject)}{_separatorRecords}");
} }
data.AppendLine($"{record.Key}{_separatorForKeyValue}{records}"); data.AppendLine($"{record.Key.Name}{_separatorForKeyValue}{records}");
} }
if (data.Length == 0) if (data.Length == 0)
{ {
@ -172,7 +175,7 @@ namespace Trolleybus.Generics
} }
} }
} }
_busStorages.Add(record[0], collection); _busStorages.Add(new BusesCollectionInfo(record[0], string.Empty), collection);
currentLine = sr.ReadLine(); currentLine = sr.ReadLine();
} }
} }

View File

@ -0,0 +1,75 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Trolleybus.DrawingObjects;
using Trolleybus.Entities;
using System.Diagnostics.CodeAnalysis;
namespace Trolleybus.Generics
{
internal class DrawingBusEquality : IEqualityComparer<DrawingBus?>
{
public bool Equals(DrawingBus? x, DrawingBus? y)
{
if (x == null || x.EntityBus == null)
{
throw new ArgumentNullException(nameof(x));
}
if (y == null || y.EntityBus == null)
{
throw new ArgumentNullException(nameof(y));
}
if (x.GetType().Name != y.GetType().Name)
{
return false;
}
if (x.EntityBus.Speed != y.EntityBus.Speed)
{
return false;
}
if (x.EntityBus.Weight != y.EntityBus.Weight)
{
return false;
}
if (x.EntityBus.BodyColor != y.EntityBus.BodyColor)
{
return false;
}
// Если оба сравниваемых объекта продвинутые
if (x is DrawingTrolleybus && y is DrawingTrolleybus)
{
// Cравнение дополнительных параметров
EntityTrolleybus entityX = (EntityTrolleybus)x.EntityBus;
EntityTrolleybus entityY = (EntityTrolleybus)y.EntityBus;
// сравнение доп. цвета
if (entityX.AdditionalColor != entityY.AdditionalColor)
{
return false;
}
// сравнение наличия "рогов"
if (entityX.Horns != entityY.Horns)
{
return false;
}
// сравнение наличия отсека для батарей
if (entityX.Batteries != entityY.Batteries)
{
return false;
}
}
return true;
}
public int GetHashCode([DisallowNull] DrawingBus obj)
{
return obj.GetHashCode();
}
}
}

View File

@ -46,7 +46,7 @@ namespace Trolleybus
listBoxSets.Items.Clear(); listBoxSets.Items.Clear();
for (int i = 0; i < _storage.Keys.Count; i++) for (int i = 0; i < _storage.Keys.Count; i++)
{ {
listBoxSets.Items.Add(_storage.Keys[i]); listBoxSets.Items.Add(_storage.Keys[i].Name);
} }
if (listBoxSets.Items.Count > 0 && (index == -1 || index >= listBoxSets.Items.Count)) if (listBoxSets.Items.Count > 0 && (index == -1 || index >= listBoxSets.Items.Count))
{ {
@ -154,6 +154,12 @@ namespace Trolleybus
MessageBox.Show("Не удалось добавить объект"); MessageBox.Show("Не удалось добавить объект");
_logger.LogWarning($"Не удалось добавить объект в набор {nameOfSet} : {ex.Message}"); _logger.LogWarning($"Не удалось добавить объект в набор {nameOfSet} : {ex.Message}");
} }
catch (ArgumentException ex)
{
MessageBox.Show("Добавляемый объект уже есть в наборе");
_logger.LogWarning($"Ошибка добавления в набор {listBoxSets.SelectedItem.ToString() ?? string.Empty} : {ex.Message}");
}
} }
/// <summary> /// <summary>
/// Удаление объекта из набора /// Удаление объекта из набора
@ -267,10 +273,45 @@ namespace Trolleybus
} }
} }
/// <summary>
/// Сортировка по типу
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonSortByType_Click(object sender, EventArgs e) => CompareBuses(new BusCompareByType());
/// <summary>
/// Сортировка по цвету
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonSortByColor_Click(object sender, EventArgs e) => CompareBuses(new BusCompareByColor());
/// <summary>
/// Сортировка по сравнителю
/// </summary>
/// <param name="comparer"></param>
private void CompareBuses(IComparer<DrawingBus?> comparer)
{
if (listBoxSets.SelectedIndex == -1)
{
return;
}
var obj = _storage[listBoxSets.SelectedItem.ToString() ?? string.Empty];
if (obj == null)
{
return;
}
obj.Sort(comparer);
pictureBoxCollection.Image = obj.ShowBuses();
}
private void InitializeComponent() private void InitializeComponent()
{ {
pictureBoxCollection = new PictureBox(); pictureBoxCollection = new PictureBox();
panelTools = new Panel(); panelTools = new Panel();
buttonSortByColor = new Button();
buttonSortByType = new Button();
panelSets = new Panel(); panelSets = new Panel();
buttonDeleteSetOfObjects = new Button(); buttonDeleteSetOfObjects = new Button();
textBoxNameOfSet = new TextBox(); textBoxNameOfSet = new TextBox();
@ -297,7 +338,7 @@ namespace Trolleybus
pictureBoxCollection.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; pictureBoxCollection.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
pictureBoxCollection.Location = new Point(0, 36); pictureBoxCollection.Location = new Point(0, 36);
pictureBoxCollection.Name = "pictureBoxCollection"; pictureBoxCollection.Name = "pictureBoxCollection";
pictureBoxCollection.Size = new Size(270, 517); pictureBoxCollection.Size = new Size(670, 617);
pictureBoxCollection.TabIndex = 0; pictureBoxCollection.TabIndex = 0;
pictureBoxCollection.TabStop = false; pictureBoxCollection.TabStop = false;
// //
@ -305,16 +346,38 @@ namespace Trolleybus
// //
panelTools.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right; panelTools.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right;
panelTools.BorderStyle = BorderStyle.FixedSingle; panelTools.BorderStyle = BorderStyle.FixedSingle;
panelTools.Controls.Add(buttonSortByColor);
panelTools.Controls.Add(buttonSortByType);
panelTools.Controls.Add(panelSets); panelTools.Controls.Add(panelSets);
panelTools.Controls.Add(buttonRefreshCollection); panelTools.Controls.Add(buttonRefreshCollection);
panelTools.Controls.Add(maskedTextBoxNumber); panelTools.Controls.Add(maskedTextBoxNumber);
panelTools.Controls.Add(buttonRemoveBus); panelTools.Controls.Add(buttonRemoveBus);
panelTools.Controls.Add(buttonAddBus); panelTools.Controls.Add(buttonAddBus);
panelTools.Location = new Point(276, 36); panelTools.Location = new Point(676, 36);
panelTools.Name = "panelTools"; panelTools.Name = "panelTools";
panelTools.Size = new Size(200, 517); panelTools.Size = new Size(200, 617);
panelTools.TabIndex = 1; panelTools.TabIndex = 1;
// //
// buttonSortByColor
//
buttonSortByColor.Location = new Point(13, 345);
buttonSortByColor.Name = "buttonSortByColor";
buttonSortByColor.Size = new Size(180, 30);
buttonSortByColor.TabIndex = 6;
buttonSortByColor.Text = "Сортировать по цвету";
buttonSortByColor.UseVisualStyleBackColor = true;
buttonSortByColor.Click += ButtonSortByColor_Click;
//
// buttonSortByType
//
buttonSortByType.Location = new Point(13, 309);
buttonSortByType.Name = "buttonSortByType";
buttonSortByType.Size = new Size(180, 30);
buttonSortByType.TabIndex = 5;
buttonSortByType.Text = "Сортировать по типу";
buttonSortByType.UseVisualStyleBackColor = true;
buttonSortByType.Click += ButtonSortByType_Click;
//
// panelSets // panelSets
// //
panelSets.Anchor = AnchorStyles.Top | AnchorStyles.Right; panelSets.Anchor = AnchorStyles.Top | AnchorStyles.Right;
@ -367,7 +430,7 @@ namespace Trolleybus
// //
// buttonRefreshCollection // buttonRefreshCollection
// //
buttonRefreshCollection.Location = new Point(17, 465); buttonRefreshCollection.Location = new Point(17, 549);
buttonRefreshCollection.Name = "buttonRefreshCollection"; buttonRefreshCollection.Name = "buttonRefreshCollection";
buttonRefreshCollection.Size = new Size(170, 40); buttonRefreshCollection.Size = new Size(170, 40);
buttonRefreshCollection.TabIndex = 3; buttonRefreshCollection.TabIndex = 3;
@ -377,7 +440,7 @@ namespace Trolleybus
// //
// maskedTextBoxNumber // maskedTextBoxNumber
// //
maskedTextBoxNumber.Location = new Point(39, 366); maskedTextBoxNumber.Location = new Point(39, 450);
maskedTextBoxNumber.Mask = "00"; maskedTextBoxNumber.Mask = "00";
maskedTextBoxNumber.Name = "maskedTextBoxNumber"; maskedTextBoxNumber.Name = "maskedTextBoxNumber";
maskedTextBoxNumber.Size = new Size(125, 27); maskedTextBoxNumber.Size = new Size(125, 27);
@ -386,7 +449,7 @@ namespace Trolleybus
// //
// buttonRemoveBus // buttonRemoveBus
// //
buttonRemoveBus.Location = new Point(17, 409); buttonRemoveBus.Location = new Point(17, 493);
buttonRemoveBus.Name = "buttonRemoveBus"; buttonRemoveBus.Name = "buttonRemoveBus";
buttonRemoveBus.Size = new Size(170, 40); buttonRemoveBus.Size = new Size(170, 40);
buttonRemoveBus.TabIndex = 1; buttonRemoveBus.TabIndex = 1;
@ -396,7 +459,7 @@ namespace Trolleybus
// //
// buttonAddBus // buttonAddBus
// //
buttonAddBus.Location = new Point(17, 311); buttonAddBus.Location = new Point(17, 395);
buttonAddBus.Name = "buttonAddBus"; buttonAddBus.Name = "buttonAddBus";
buttonAddBus.Size = new Size(170, 40); buttonAddBus.Size = new Size(170, 40);
buttonAddBus.TabIndex = 0; buttonAddBus.TabIndex = 0;
@ -410,7 +473,7 @@ namespace Trolleybus
menuStrip.Items.AddRange(new ToolStripItem[] { fileToolStripMenuItem }); menuStrip.Items.AddRange(new ToolStripItem[] { fileToolStripMenuItem });
menuStrip.Location = new Point(0, 0); menuStrip.Location = new Point(0, 0);
menuStrip.Name = "menuStrip"; menuStrip.Name = "menuStrip";
menuStrip.Size = new Size(482, 28); menuStrip.Size = new Size(882, 28);
menuStrip.TabIndex = 2; menuStrip.TabIndex = 2;
menuStrip.Text = "menuStrip1"; menuStrip.Text = "menuStrip1";
// //
@ -446,7 +509,7 @@ namespace Trolleybus
// //
// FormBusesCollection // FormBusesCollection
// //
ClientSize = new Size(482, 553); ClientSize = new Size(882, 653);
Controls.Add(panelTools); Controls.Add(panelTools);
Controls.Add(pictureBoxCollection); Controls.Add(pictureBoxCollection);
Controls.Add(menuStrip); Controls.Add(menuStrip);
@ -463,7 +526,8 @@ namespace Trolleybus
ResumeLayout(false); ResumeLayout(false);
PerformLayout(); PerformLayout();
} }
private Button buttonSortByColor;
private Button buttonSortByType;
private PictureBox pictureBoxCollection; private PictureBox pictureBoxCollection;
private Panel panelTools; private Panel panelTools;
private Button buttonRefreshCollection; private Button buttonRefreshCollection;

View File

@ -35,18 +35,23 @@ namespace Trolleybus.Generics
_maxCount = count; _maxCount = count;
_places = new List<T?>(count); _places = new List<T?>(count);
} }
/// <summary>
/// Сортировка набора объектов
/// </summary>
/// <param name="comparer"></param>
public void SortSet(IComparer<T?> comparer) => _places.Sort(comparer);
/// <summary> /// <summary>
/// Добавление объекта в начало набора /// Добавление объекта в начало набора
/// </summary> /// </summary>
/// <param name="bus">Добавляемый автобус</param> /// <param name="bus">Добавляемый автобус</param>
/// <returns></returns> /// <returns></returns>
public int Insert(T bus) public int Insert(T bus, IEqualityComparer<T?>? equal = null)
{ {
if (Count + 1 <= _maxCount) if (Count + 1 <= _maxCount)
{ {
_places.Insert(0, bus); return Insert(bus, 0, equal);
//0 в данном случае место, на котоорое добавился элемннт, вставка прошла успешно
return 0;
} }
//если при добавлении в списке станет больше макс. кол-ва элементов, то как бы вставлять будет некуда //если при добавлении в списке станет больше макс. кол-ва элементов, то как бы вставлять будет некуда
throw new StorageOverflowException(_maxCount); throw new StorageOverflowException(_maxCount);
@ -57,7 +62,7 @@ namespace Trolleybus.Generics
/// <param name="bus">Добавляемый автобус</param> /// <param name="bus">Добавляемый автобус</param>
/// <param name="position">Позиция</param> /// <param name="position">Позиция</param>
/// <returns></returns> /// <returns></returns>
public int Insert(T bus, int position) public int Insert(T bus, int position, IEqualityComparer<T>? equal = null)
{ {
if (position >= _maxCount || position < 0) if (position >= _maxCount || position < 0)
{ {
@ -66,6 +71,10 @@ namespace Trolleybus.Generics
} }
if (Count + 1 <= _maxCount) if (Count + 1 <= _maxCount)
{ {
if (equal != null && _places.Contains(bus, equal))
{
throw new ArgumentException("Объект уже существует");
}
_places.Insert(position, bus); _places.Insert(position, bus);
//место в списке, по которому вставили, вставка прошла успешно //место в списке, по которому вставили, вставка прошла успешно
return position; return position;