218.85K
Категория: ПрограммированиеПрограммирование

ArrayList и List<T>

1.

ArrayList
List<T>
IList

2.

Отличие ArrayList от List<t>
Основное отличие ArrayList от List<T> заключается в том, что ArrayList позволяет хранит в
нем любые объекты класса Object, то есть ссылки без конкретной привязки к типу
данных. Это может привести к ошибке, пропущенной на этапе компиляции, например:
ArrayList array = new ArrayList();
array.Add(1);
array.Add("string"); // Нет ошибки
int total = 0;
foreach (int num in array)
{
total += num; // ошибка приведения типов
}
List<T> позволяет избегать постоянного приведения типов, за счет чего он считается
быстрее.

3.

Интерфейс IList
Основные свойства:
• Count - получает число элементов
• IsFixedSize - указывает, имеет ли список фиксированный размер
• IsReadOnly - указывает, доступен ли список только для чтения
• IsSynchronized - указывает является ли доступ синхронизированным
Основные методы:
• Add(Object) Добавляет элемент в конец
• Clear() Удаляет все элементы
• Contains(Object) Указывает, содержит ли список указанное значение
• CopyTo(Array, Int32) Копирует элементы в массив, начиная с указанного индекса
• IndexOf(Object) Определяет индекс заданного элемента
• Insert(Int32, Object) Вставляет элемент по указанному индексу
• Remove(Object) Удаляет первое вхождение указанного элемента
• RemoveAt(Int32) Удаляет элемент по указанному индексу

4.

Реализация списка
Односвязный список - это динамическая структура данных, состоящая из узлов. Каждый узел
будет иметь какое-то значение и указатель на следующий узел.
Одна из возможных реалицаий:
internal class Element // Элементы составляющие список
{
internal object value;
internal Element nextElement;
internal Element(object value)
{
this.value = value;
}
internal Element(object value, Element nextElement) : this(value)
{
this.nextElement = nextElement;
}
}

5.

Реализация списка
//Свойства
internal Element startList; // Начало списка
public bool IsFixedSize { get; set; } // Указывает имеет ли список фиксированный размер.
public bool IsReadOnly { get; set; } // Указывает является ли объект доступным только для чтения.
public int Count // Уозвращает количество элементов в списке
{
get
{
int count = 0;
Element element = startList;
while (true)
{
if (element == null) return count;
element = element.nextElement;
count++;
}
}
}

6.

private void ChecIndex(int index) // Проверка коректности индекса
{
if (index >= Count || index < 0) { throw new IndexOutOfRangeException(); }
return;
}
public Object this[int i] // Индексатор
{
get
{
ChecIndex(i);
Element element = startList;
while (i != 0)
{
element = element.nextElement;
i--;
}
return element.value;
}

7.

set
{
if (IsReadOnly) return;
ChecIndex(i);
Element element = startList;
while (i != 0)
{
element = element.nextElement;
i--;
}
element.value = value;
}
}

8.

public int Add(Object obj) // Добавление элемента в конец
{
if (IsFixedSize || IsReadOnly) return -1;
if (startList == null) { startList = new Element(obj); return 0; }
Element element = startList;
int index = 0;
while (true)
{
if (element.nextElement == null)
{
element.nextElement = new Element(obj);
return index + 1;
}
else element = element.nextElement; index++;
}
}

9.

public void Clear() // Очистка списка
{
if (IsReadOnly) return;
if (IsFixedSize)
{
Element element = startList;
while (true)
{
if (element == null) return;
element.value = null;
element = element.nextElement;
}
}
startList = null;
}

10.

public bool Contains(Object obj) // Проверка нахождения элемента в списке
{ Element element = startList;
while (true) {
if (element == null) return false;
if (element.value == obj) return true;
element = element.nextElement;
}
}
public int IndexOf(Object obj) // Определяет индекс конкретного элемента в списке
{ Element element = startList;
int index = 0;
while (true) {
if (element == null) return -1;
if (element.value == obj) return index;
element = element.nextElement;
index++;
}
}

11.

public void Insert(int index, Object obj) // Добавление элемента под определенный индекс
{
if (IsReadOnly) return;
if (index == 0) { startList = new Element(obj, startList); return; }
ChecIndex(index);
Element element = startList;
while (true)
{
if (index == 1)
{
element.nextElement = new Element(obj, element.nextElement);
return;
}
element = element.nextElement;
index--;
}
}

12.

public void Remove(Object obj) // Удаление первого вхождения элемента
{
if (startList == null || IsFixedSize || IsReadOnly) return;
if (startList.value == obj) { startList = startList.nextElement; return; }
Element element = startList;
while (true)
{
if (element.nextElement == null) return;
if (element.nextElement.value == obj)
{
element.nextElement = element.nextElement.nextElement;
return;
}
element = element.nextElement;
}
}

13.

public void RemoveAt(int index) // Удаление по индексу
{
if (IsFixedSize || IsReadOnly) return;
if (index == 0) { startList = startList.nextElement; return; }
ChecIndex(index);
Element element = startList;
while (true)
{
if (index == 1)
{
element.nextElement = element.nextElement.nextElement;
return;
}
element = element.nextElement;
index--;
}
}

14.

public void CopyTo(Array array, int index = 0) // Копирует все элементы текущего списка в заданный
одномерный массив начиная с указанного индекса
{
ChecIndex(index);
Element element = startList;
int indexCopy = 0;
while (true)
{
if (element == null) return;
if (index <= 0)
{
array.SetValue(element.value, indexCopy++);
}
element = element.nextElement;
index--;
}
}

15.

Пример программы реализующей список

16.

Спасибо за просмотр
English     Русский Правила