Петрушин Егор ПИбд-22 Лабораторная работа №4 "Самоходная артиллерийская установка" #9

Closed
Egor_Petrushin wants to merge 5 commits from PIbd-22_Petrushin_E.A._Lab4 into PIbd-22_Petrushin_E.A._Lab3
3 changed files with 67 additions and 32 deletions
Showing only changes of commit 3400af8ec5 - Show all commits

View File

@ -43,6 +43,7 @@ namespace SelfPropelledArtilleryUnit
if (form.ShowDialog() == DialogResult.OK)
{
int addedIndex = _SPAUs + form.SelectedSPAU;
//MessageBox.Show(addedIndex.ToString());
if (addedIndex != -1 && addedIndex <= countPlaces)
{

View File

@ -72,7 +72,7 @@ namespace SelfPropelledArtilleryUnit.Generics
/// <returns></returns>
public static bool operator -(SPAUGenericCollection<T, U> collect, int pos)
{
T? obj = collect._collection.Get(pos);
T? obj = collect._collection[pos];
if (obj != null)
{
collect._collection.Remove(pos);
@ -90,7 +90,7 @@ namespace SelfPropelledArtilleryUnit.Generics
/// <returns></returns>
public U? GetU(int pos)
{
return (U?)_collection.Get(pos)?.GetMoveableObject;
return (U?)_collection[pos]?.GetMoveableObject;
}
/// <summary>
/// Вывод всего набора объектов
@ -135,7 +135,7 @@ namespace SelfPropelledArtilleryUnit.Generics
DrawningSPAU current;
for (int i = 0; i < _collection.Count; i++)
{
current = _collection.Get(i);
current = _collection[i];
current?.SetPosition(stringCount * 200, 280 - j * 100);
stringCount++;
if (stringCount >= 3)

View File

@ -17,18 +17,23 @@ namespace SelfPropelledArtilleryUnit.Generics
/// <summary>
/// Массив объектов, которые храним
/// </summary>
private readonly T?[] _places;
private readonly List<T?> _places;
/// <summary>
/// Количество объектов в массиве
/// </summary>
public int Count => _places.Length;
public int Count => _places.Count;
/// <summary>
/// Максимальное количество объектов в списке
/// </summary>
private readonly int _maxCount;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="count"></param>
public SetGeneric(int count)
{
_places = new T?[count];
_maxCount = count;
_places = new List<T?>(count);
}
/// <summary>
/// Добавление объекта в набор
@ -47,35 +52,34 @@ namespace SelfPropelledArtilleryUnit.Generics
/// <returns></returns>
public int Insert(T spau, int position)
{
if (position < 0 || spau == null)
{
if (Count == _maxCount)
return -1;
}
if (position >= Count)
{
return -1;
}
// Ищем первую пустую позицию начиная с указанной позиции
int positionNull = Array.FindIndex(_places, position, x => x == null);
if (positionNull == -1 && _places[Count - 1] != null)
{
// Если пустых позиций нет и последняя позиция в массиве занята
if (position < 0 || spau == null)
return -1;
}
else if (positionNull == -1)
if (position >= _maxCount)
return -1;
int nullIndex = _places.IndexOf(null);
if (Count == 0)
{
// Если позиция для вставки пустая, а пустых позиций больше нет
positionNull = Count - 1;
_places.Add(spau);
}
// Сдвигаем элементы вправо, начиная с первой пустой позиции и заканчивая указанной позицией
for (int i = positionNull; i > position; i--)
else if (nullIndex != -1)
{
_places[i] = _places[i - 1];
for (int i = nullIndex; i > 0; i--)
{
_places[i] = _places[i - 1];
}
_places[position] = spau;
}
// Вставка по позиции
_places[position] = spau;
return position;
else
{
_places.Insert(position, spau);
}
return Count;
}
/// <summary>
/// Удаление объекта из набора с конкретной позиции
@ -96,12 +100,42 @@ namespace SelfPropelledArtilleryUnit.Generics
/// </summary>
/// <param name="position"></param>
/// <returns></returns>
public T? Get(int position)
public T? this[int position]
{
if (position < 0 || position >= Count)
return null;
return _places[position];
get
{
if (position < 0 || position >= _maxCount)
return null;
return _places[position];
}
set
{
if (position < 0 || position >= _maxCount)
return;
if(_places[position] == null)
{
_places[position] = value;
return;
}
_places.Insert(position, value);
}
}
/// <summary>
/// Проход по списку
/// </summary>
/// <returns></returns>
public IEnumerable<T?> GetSPAUs(int? maxSPAUs = null)
{
for (int i = 0; i < _places.Count; ++i)
{
yield return _places[i];
if (maxSPAUs.HasValue && i == maxSPAUs.Value)
{
yield break;
}
}
}
}
}