Lab8 done

This commit is contained in:
Алексей Тихоненков 2023-12-11 22:27:32 +04:00
parent b5aeebf132
commit 477cf6921a
8 changed files with 212 additions and 20 deletions

View File

@ -30,6 +30,8 @@
{ {
this.pictureBoxCollection = new System.Windows.Forms.PictureBox(); this.pictureBoxCollection = new System.Windows.Forms.PictureBox();
this.panelTools = new System.Windows.Forms.Panel(); this.panelTools = new System.Windows.Forms.Panel();
this.ButtonSortByColor = new System.Windows.Forms.Button();
this.ButtonSortByType = new System.Windows.Forms.Button();
this.panel1 = new System.Windows.Forms.Panel(); this.panel1 = new System.Windows.Forms.Panel();
this.textBoxStorageName = new System.Windows.Forms.TextBox(); this.textBoxStorageName = new System.Windows.Forms.TextBox();
this.listBoxStorages = new System.Windows.Forms.ListBox(); this.listBoxStorages = new System.Windows.Forms.ListBox();
@ -61,6 +63,8 @@
// //
// panelTools // panelTools
// //
this.panelTools.Controls.Add(this.ButtonSortByColor);
this.panelTools.Controls.Add(this.ButtonSortByType);
this.panelTools.Controls.Add(this.panel1); this.panelTools.Controls.Add(this.panel1);
this.panelTools.Controls.Add(this.maskedTextBoxNumber); this.panelTools.Controls.Add(this.maskedTextBoxNumber);
this.panelTools.Controls.Add(this.buttonUpdateColletion); this.panelTools.Controls.Add(this.buttonUpdateColletion);
@ -72,13 +76,33 @@
this.panelTools.TabIndex = 1; this.panelTools.TabIndex = 1;
this.panelTools.Tag = ""; this.panelTools.Tag = "";
// //
// ButtonSortByColor
//
this.ButtonSortByColor.Location = new System.Drawing.Point(25, 344);
this.ButtonSortByColor.Name = "ButtonSortByColor";
this.ButtonSortByColor.Size = new System.Drawing.Size(193, 35);
this.ButtonSortByColor.TabIndex = 10;
this.ButtonSortByColor.Text = "Сортировка по цвету";
this.ButtonSortByColor.UseVisualStyleBackColor = true;
this.ButtonSortByColor.Click += new System.EventHandler(this.ButtonSortByColor_Click);
//
// ButtonSortByType
//
this.ButtonSortByType.Location = new System.Drawing.Point(27, 303);
this.ButtonSortByType.Name = "ButtonSortByType";
this.ButtonSortByType.Size = new System.Drawing.Size(193, 35);
this.ButtonSortByType.TabIndex = 9;
this.ButtonSortByType.Text = "Сортировка по типу";
this.ButtonSortByType.UseVisualStyleBackColor = true;
this.ButtonSortByType.Click += new System.EventHandler(this.ButtonSortByType_Click);
//
// panel1 // panel1
// //
this.panel1.Controls.Add(this.textBoxStorageName); this.panel1.Controls.Add(this.textBoxStorageName);
this.panel1.Controls.Add(this.listBoxStorages); this.panel1.Controls.Add(this.listBoxStorages);
this.panel1.Controls.Add(this.buttonAddCollection); this.panel1.Controls.Add(this.buttonAddCollection);
this.panel1.Controls.Add(this.buttonDelCollection); this.panel1.Controls.Add(this.buttonDelCollection);
this.panel1.Location = new System.Drawing.Point(15, 52); this.panel1.Location = new System.Drawing.Point(15, 3);
this.panel1.Name = "panel1"; this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(215, 294); this.panel1.Size = new System.Drawing.Size(215, 294);
this.panel1.TabIndex = 8; this.panel1.TabIndex = 8;
@ -242,5 +266,7 @@
private ToolStripMenuItem LoadToolStripMenuItem; private ToolStripMenuItem LoadToolStripMenuItem;
private OpenFileDialog openFileDialog; private OpenFileDialog openFileDialog;
private SaveFileDialog saveFileDialog; private SaveFileDialog saveFileDialog;
private Button ButtonSortByColor;
private Button ButtonSortByType;
} }
} }

View File

@ -37,7 +37,7 @@ namespace AntiAircraftGun
listBoxStorages.Items.Clear(); listBoxStorages.Items.Clear();
for (int i = 0; i < _storage.Keys.Count; i++) for (int i = 0; i < _storage.Keys.Count; i++)
{ {
listBoxStorages.Items.Add(_storage.Keys[i]); listBoxStorages.Items.Add(_storage.Keys[i].Name);
} }
if (listBoxStorages.Items.Count > 0 && (index == -1 || index if (listBoxStorages.Items.Count > 0 && (index == -1 || index
>= listBoxStorages.Items.Count)) >= listBoxStorages.Items.Count))
@ -129,6 +129,11 @@ namespace AntiAircraftGun
Serilog.Log.Warning($"Коллекция {listBoxStorages.SelectedItem.ToString() ?? string.Empty} переполнена"); Serilog.Log.Warning($"Коллекция {listBoxStorages.SelectedItem.ToString() ?? string.Empty} переполнена");
MessageBox.Show(ex.Message); MessageBox.Show(ex.Message);
} }
catch (ArgumentException ex)
{
Serilog.Log.Warning($"Добавляемый объект уже существует в коллекции {listBoxStorages.SelectedItem.ToString() ?? string.Empty}");
MessageBox.Show("Добавляемый объект уже сущесвует в коллекции");
}
}); });
form.AddEvent(zenitDelegate); form.AddEvent(zenitDelegate);
} }
@ -226,6 +231,7 @@ namespace AntiAircraftGun
{ {
listBoxStorages.Items.Add(collection); listBoxStorages.Items.Add(collection);
} }
ReloadObjects();
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -235,6 +241,25 @@ namespace AntiAircraftGun
} }
} }
} }
private void ButtonSortByType_Click(object sender, EventArgs e) => CompareAntiAirCraftGun(new AntiAirCraftGunCompareByType());
private void ButtonSortByColor_Click(object sender, EventArgs e) => CompareAntiAirCraftGun(new AntiAirCraftGunCompareByColor());
private void CompareAntiAirCraftGun(IComparer<BaseDrawingAntiAirCraftGun?> comparer)
{
if (listBoxStorages.SelectedIndex == -1)
{
return;
}
var obj = _storage[listBoxStorages.SelectedItem.ToString() ??
string.Empty];
if (obj == null)
{
return;
}
obj.Sort(comparer);
pictureBoxCollection.Image = obj.ShowZenits();
}
} }
} }

View File

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

View File

@ -0,0 +1,73 @@
using AntiAircraftGun.DrawingObjects;
using AntiAircraftGun.Enitites;
using AntiAircraftGun.MovementStrategy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntiAircraftGun.Generics
{
internal class AntiAirCraftGunCompareByColor : IComparer<BaseDrawingAntiAirCraftGun?>
{
public int Compare(BaseDrawingAntiAirCraftGun? x, BaseDrawingAntiAirCraftGun? y)
{
if (x == null && y == null)
{
// Оба объекта равны
return 0;
}
if (x == null && y != null)
{
// Объект x меньше
return 1;
}
if (x != null && y == null)
{
// Объект x больше
return -1;
}
var xAntiAircraftGun = x as BaseDrawingAntiAirCraftGun;
var yAntiAircraftGun = y as BaseDrawingAntiAirCraftGun;
if (xAntiAircraftGun == null && yAntiAircraftGun == null)
{
return 0;
}
if (xAntiAircraftGun == null && yAntiAircraftGun != null)
{
return 1;
}
if (xAntiAircraftGun != null && yAntiAircraftGun == null)
{
return -1;
}
if (xAntiAircraftGun.AntiAirСraftGun.BodyColor == yAntiAircraftGun.AntiAirСraftGun.BodyColor)
{
// Объекты равны по цвету
return 0;
}
if (xAntiAircraftGun.AntiAirСraftGun.BodyColor.R.CompareTo(yAntiAircraftGun.AntiAirСraftGun.BodyColor.R) == 0)
{
if (xAntiAircraftGun.AntiAirСraftGun.BodyColor.G.CompareTo(yAntiAircraftGun.AntiAirСraftGun.BodyColor.G) == 0)
{
// Сравнение по компоненте B, если R и G совпадают
return xAntiAircraftGun.AntiAirСraftGun.BodyColor.B.CompareTo(yAntiAircraftGun.AntiAirСraftGun.BodyColor.B);
}
else
{
// Сравнение по компоненте G, если R совпадает, но G не совпадает
return xAntiAircraftGun.AntiAirСraftGun.BodyColor.G.CompareTo(yAntiAircraftGun.AntiAirСraftGun.BodyColor.G);
}
}
else
{
// Сравнение по компоненте R, если R не совпадает
return xAntiAircraftGun.AntiAirСraftGun.BodyColor.R.CompareTo(yAntiAircraftGun.AntiAirСraftGun.BodyColor.R);
}
}
}
}

View File

@ -0,0 +1,32 @@
using AntiAircraftGun.DrawingObjects;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AntiAircraftGun.Generics
{
internal class AntiAirCraftGunCompareByType : IComparer<BaseDrawingAntiAirCraftGun?>
{
public int Compare(BaseDrawingAntiAirCraftGun? x, BaseDrawingAntiAirCraftGun? y)
{
if (x == null || x.AntiAirСraftGun == null)
throw new ArgumentNullException(nameof(x));
if (y == null || y.AntiAirСraftGun == null)
throw new ArgumentNullException(nameof(y));
if (x.GetType().Name != y.GetType().Name)
{
return x.GetType().Name.CompareTo(y.GetType().Name);
}
var speedCompare = x.AntiAirСraftGun.Speed.CompareTo(y.AntiAirСraftGun.Speed);
if (speedCompare != 0)
return speedCompare;
return x.AntiAirСraftGun.Weight.CompareTo(y.AntiAirСraftGun.Weight);
}
}
}

View File

@ -36,6 +36,7 @@ namespace AntiAircraftGun.Generics
/// Набор объектов /// Набор объектов
/// </summary> /// </summary>
private readonly SetGeneric<T> _collection; private readonly SetGeneric<T> _collection;
public void Sort(IComparer<T?> comparer) => _collection.SortSet(comparer);
/// <summary> /// <summary>
/// Конструктор /// Конструктор
/// </summary> /// </summary>
@ -59,7 +60,7 @@ namespace AntiAircraftGun.Generics
{ {
if (obj == null) if (obj == null)
return false; return false;
return collect?._collection.Insert(obj) ?? false; return collect?._collection.Insert(obj, new DrawingAntiAirCraftGunEqutables()) ?? false;
} }
/// <summary> /// <summary>
/// Перегрузка оператора вычитания /// Перегрузка оператора вычитания

View File

@ -5,6 +5,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Xml.Linq;
namespace AntiAircraftGun.Generics namespace AntiAircraftGun.Generics
{ {
@ -28,11 +29,11 @@ namespace AntiAircraftGun.Generics
/// <summary> /// <summary>
/// Словарь (хранилище) /// Словарь (хранилище)
/// </summary> /// </summary>
readonly Dictionary<string, AntiAirCraftGunGenericCollection<BaseDrawingAntiAirCraftGun, DrawingObjectAntiAirCraftGun>> _zenitStorages; readonly Dictionary<AntiAirCraftGunCollectionInfo, AntiAirCraftGunGenericCollection<BaseDrawingAntiAirCraftGun, DrawingObjectAntiAirCraftGun>> _zenitStorages;
/// <summary> /// <summary>
/// Возвращение списка названий наборов /// Возвращение списка названий наборов
/// </summary> /// </summary>
public List<string> Keys => _zenitStorages.Keys.ToList(); public List<AntiAirCraftGunCollectionInfo> Keys => _zenitStorages.Keys.ToList();
/// <summary> /// <summary>
/// Ширина окна отрисовки /// Ширина окна отрисовки
/// </summary> /// </summary>
@ -48,7 +49,7 @@ namespace AntiAircraftGun.Generics
/// <param name="pictureHeight"></param> /// <param name="pictureHeight"></param>
public AntiAirCraftGunGenericStorage(int pictureWidth, int pictureHeight) public AntiAirCraftGunGenericStorage(int pictureWidth, int pictureHeight)
{ {
_zenitStorages = new Dictionary<string, AntiAirCraftGunGenericCollection<BaseDrawingAntiAirCraftGun, DrawingObjectAntiAirCraftGun>>(); _zenitStorages = new Dictionary<AntiAirCraftGunCollectionInfo, AntiAirCraftGunGenericCollection<BaseDrawingAntiAirCraftGun, DrawingObjectAntiAirCraftGun>>();
_pictureWidth = pictureWidth; _pictureWidth = pictureWidth;
_pictureHeight = pictureHeight; _pictureHeight = pictureHeight;
} }
@ -59,13 +60,13 @@ namespace AntiAircraftGun.Generics
public void AddSet(string name) public void AddSet(string name)
{ {
// TODO: Прописать логику для добавления набора // TODO: Прописать логику для добавления набора
if (_zenitStorages.ContainsKey(name)) if (_zenitStorages.ContainsKey(new AntiAirCraftGunCollectionInfo(name, string.Empty)))
{ {
MessageBox.Show("Набор с таким именем уже существует"); MessageBox.Show("Набор с таким именем уже существует");
return; return;
} }
_zenitStorages.Add(name, new AntiAirCraftGunGenericCollection<BaseDrawingAntiAirCraftGun, DrawingObjectAntiAirCraftGun>(_pictureWidth, _pictureHeight)); _zenitStorages.Add(new AntiAirCraftGunCollectionInfo(name,string.Empty), new AntiAirCraftGunGenericCollection<BaseDrawingAntiAirCraftGun, DrawingObjectAntiAirCraftGun>(_pictureWidth, _pictureHeight));
} }
/// <summary> /// <summary>
@ -75,12 +76,12 @@ namespace AntiAircraftGun.Generics
public void DelSet(string name) public void DelSet(string name)
{ {
// TODO: Прописать логику для удаления набора // TODO: Прописать логику для удаления набора
if (!_zenitStorages.ContainsKey(name)) if (!_zenitStorages.ContainsKey(new AntiAirCraftGunCollectionInfo(name, string.Empty)))
{ {
return; return;
} }
_zenitStorages.Remove(name); _zenitStorages.Remove(new AntiAirCraftGunCollectionInfo(name, string.Empty));
} }
/// <summary> /// <summary>
/// Доступ к набору /// Доступ к набору
@ -92,10 +93,11 @@ namespace AntiAircraftGun.Generics
{ {
get get
{ {
AntiAirCraftGunCollectionInfo indobj = new AntiAirCraftGunCollectionInfo(ind, string.Empty);
// TODO: Продумать логику получения набора // TODO: Продумать логику получения набора
if (_zenitStorages.ContainsKey(ind)) if (_zenitStorages.ContainsKey(indobj))
{ {
return _zenitStorages[ind]; return _zenitStorages[indobj];
} }
else else
{ {
@ -115,15 +117,14 @@ namespace AntiAircraftGun.Generics
File.Delete(filename); File.Delete(filename);
} }
StringBuilder data = new(); StringBuilder data = new();
foreach (KeyValuePair<string, foreach (KeyValuePair<AntiAirCraftGunCollectionInfo, AntiAirCraftGunGenericCollection<BaseDrawingAntiAirCraftGun, DrawingObjectAntiAirCraftGun>> record in _zenitStorages)
AntiAirCraftGunGenericCollection<BaseDrawingAntiAirCraftGun, DrawingObjectAntiAirCraftGun>> record in _zenitStorages)
{ {
StringBuilder records = new(); StringBuilder records = new();
foreach (BaseDrawingAntiAirCraftGun? elem in record.Value.GetCars) foreach (BaseDrawingAntiAirCraftGun? elem in record.Value.GetCars)
{ {
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)
{ {
@ -186,7 +187,7 @@ namespace AntiAircraftGun.Generics
} }
} }
} }
_zenitStorages.Add(record[0], collection); _zenitStorages.Add(new AntiAirCraftGunCollectionInfo(record[0],string.Empty), collection);
str = sr.ReadLine(); str = sr.ReadLine();
} while (str != null); } while (str != null);

View File

@ -31,26 +31,32 @@ namespace AntiAircraftGun.Generics
_maxCount = count; _maxCount = count;
_places = new List<T?>(count); _places = new List<T?>(count);
} }
public void SortSet(IComparer<T?> comparer) => _places.Sort(comparer);
/// <summary> /// <summary>
/// Добавление объекта в набор /// Добавление объекта в набор
/// </summary> /// </summary>
/// <param name="car">Добавляемый автомобиль</param> /// <param name="car">Добавляемый автомобиль</param>
/// <returns></returns> /// <returns></returns>
public bool Insert(T car) public bool Insert(T car, IEqualityComparer<T>? equal = null)
{ {
if (_places.Count == _maxCount) if (_places.Count == _maxCount)
throw new StorageOverflowException(_maxCount); throw new StorageOverflowException(_maxCount);
Insert(car, 0); Insert(car, 0, equal);
return true; return true;
} }
public bool Insert(T car, int position) public bool Insert(T car, int position, IEqualityComparer<T>? equal = null)
{ {
if (_places.Count == _maxCount) if (_places.Count == _maxCount)
throw new StorageOverflowException(_maxCount); throw new StorageOverflowException(_maxCount);
if (!(position >= 0 && position <= Count)) if (!(position >= 0 && position <= Count))
return false; return false;
_places.Insert(position, car); if (equal != null)
{
if (_places.Contains(car, equal))
throw new ArgumentException(nameof(car));
}
_places.Insert(position, car);
return true; return true;
} }