Класс List в C# и его методы
Класс List призван для работы со списками. В классе List есть методы по добавлению, удалению, вставке элементов и прочее. Списки -очень удобный инструмент для программирования. Списки применяются там, где количество элементов в коллекции на перед не известно. Списки выгодно отличаются от массивов тем, что по ходу выполнения программы их размер можно изменять в любую сторону.
Методы класса ListИмя | Описание |
Add | Добавляет объект в конец коллекции List |
AddRange | Добавляет элементы указанной коллекции в конец списка List |
AsReadOnly | Возвращает для текущей коллекции оболочку IList |
BinarySearch | Перегружен. Использует алгоритм двоичного поиска для нахождения определенного элемента в отсортированном списке List |
Clear | Удаляет все элементы из коллекции List |
Contains | Определяет, входит ли элемент в состав List |
ConvertAll<(Of <(TOutput>)>) | Преобразует элементы текущего списка List |
CopyTo | Перегружен. Копирует список List |
Equals | Определяет, равен ли заданный объект Object текущему объекту Object. (Унаследовано от Object.) |
Exists | Определяет, содержит ли List |
Finalize | Позволяет объекту Object попытаться освободить ресурсы и выполнить другие операции очистки, перед тем как объект Object будет утилизирован в процессе сборки мусора. (Унаследовано от Object.) |
Find | Выполняет поиск элемента, удовлетворяющего условиям указанного предиката, и возвращает первое найденное вхождение в пределах всего списка List |
FindAll | Извлекает все элементы, удовлетворяющие условиям указанного предиката. |
FindIndex | Перегружен. Выполняет поиск элемента, удовлетворяющего условиям указанного предиката, и возвращает отсчитываемый от нуля индекс первого найденного вхождения в пределах всего списка List |
FindLast | Выполняет поиск элемента, удовлетворяющего условиям указанного предиката, и возвращает последнее найденное вхождение в пределах всего списка List |
FindLastIndex | Перегружен. Выполняет поиск элемента, удовлетворяющего условиям указанного предиката, и возвращает отсчитываемый от нуля индекс последнего найденного вхождения в пределах всего списка List |
ForEach | Выполняет указанное действие с каждым элементом списка List |
GetEnumerator | Возвращает перечислитель, осуществляющий перебор элементов списка List |
GetHashCode | Играет роль хэш-функции для определенного типа. (Унаследовано от Object.) |
GetRange | Создает неполную копию диапазона элементов исходного списка List |
GetType | Возвращает объект Type для текущего экземпляра. (Унаследовано от Object.) |
IndexOf | Перегружен. Возвращает отсчитываемый от нуля индекс первого вхождения значения в списке List |
Insert | Добавляет элемент в список List |
InsertRange | Вставляет элементы коллекции в список List |
LastIndexOf | Перегружен. Возвращает отсчитываемый от нуля индекс последнего вхождения значения в списке List |
MemberwiseClone | Создает неполную копию текущего объекта Object. (Унаследовано от Object.) |
Remove | Удаляет первое вхождение указанного объекта из коллекции List |
RemoveAll | Удаляет все элементы, удовлетворяющие условиям указанного предиката. |
RemoveAt | Удаляет элемент списка List |
RemoveRange | Удаляет диапазон элементов из списка List |
Reverse | Перегружен. Изменяет порядок элементов в списке List |
Sort | Перегружен. Сортирует элементы в списке List |
ToArray | Копирует элементы списка List |
ToString | Возвращает объект String, который представляет текущий объект Object. (Унаследовано от Object.) |
TrimExcess | яадает емкость, равную фактическому числу элементов в списке List |
TrueForAll | Определяет, все ли элементы списка List |
Метод Add() добавляет объект в конец коллекции List.
Синтаксис
public void Add(T item)
Пример:
using System;using System.Collections.Generic; public class Example { public static void Main() { List<string> dinosaurs = new List<string>(); Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity); dinosaurs.Add("Tyrannosaurus"); dinosaurs.Add("Amargasaurus"); dinosaurs.Add("Mamenchisaurus"); dinosaurs.Add("Deinonychus"); dinosaurs.Add("Compsognathus"); Console.WriteLine(); foreach(string dinosaur in dinosaurs) { Console.WriteLine(dinosaur); } Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity); Console.WriteLine("Count: {0}", dinosaurs.Count); Console.WriteLine("\nContains(\"Deinonychus\"): {0}", dinosaurs.Contains("Deinonychus")); Console.WriteLine("\nInsert(2, \"Compsognathus\")"); dinosaurs.Insert(2, "Compsognathus"); Console.WriteLine(); foreach(string dinosaur in dinosaurs) { Console.WriteLine(dinosaur); } Console.WriteLine("\ndinosaurs[3]: {0}", dinosaurs[3]); Console.WriteLine("\nRemove(\"Compsognathus\")"); dinosaurs.Remove("Compsognathus"); Console.WriteLine(); foreach(string dinosaur in dinosaurs) { Console.WriteLine(dinosaur); } dinosaurs.TrimExcess(); Console.WriteLine("\nTrimExcess()"); Console.WriteLine("Capacity: {0}", dinosaurs.Capacity); Console.WriteLine("Count: {0}", dinosaurs.Count); dinosaurs.Clear(); Console.WriteLine("\nClear()"); Console.WriteLine("Capacity: {0}", dinosaurs.Capacity); Console.WriteLine("Count: {0}", dinosaurs.Count); } } /* This code example produces the following output: Capacity: 0 Tyrannosaurus Amargasaurus Mamenchisaurus Deinonychus Compsognathus Capacity: 8 Count: 5 Contains("Deinonychus"): True Insert(2, "Compsognathus") Tyrannosaurus Amargasaurus Compsognathus Mamenchisaurus Deinonychus Compsognathus dinosaurs[3]: Mamenchisaurus Remove("Compsognathus") Tyrannosaurus Amargasaurus Mamenchisaurus Deinonychus Compsognathus TrimExcess() Capacity: 5 Count: 5 Clear() Capacity: 5 Count: 0 */Метод AddRange
Добавляет элементы указанной коллекции в конец списка List
Порядок элементов коллекции сохраняется в списке List
Если новое значение свойства Count (текущее значение Count плюс размер коллекции) превышает значение Capacity, емкость списка List
Если список List
Синтаксис
public ReadOnlyCollection<T> AsReadOnly()
Пример:
В следующем примере кода демонстрируется метод AddRange и ряд других методов класса List
using System; using System.Collections.Generic;public class Example { public static void Main() { string[] input = { "Brachiosaurus", "Amargasaurus", "Mamenchisaurus" };// массив строк, который добавляется в список List<string> dinosaurs = new List<string>(input); // создаём список из исходного массива Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity); // выводим на экран список Console.WriteLine(); foreach( string dinosaur in dinosaurs ) //пока есть элементы в списке, выводим их на экран { Console.WriteLine(dinosaur); } Console.WriteLine("\nAddRange(dinosaurs)"); dinosaurs.AddRange(dinosaurs); // добавляем диапазон значений в список Console.WriteLine(); foreach( string dinosaur in dinosaurs ) { Console.WriteLine(dinosaur); // снова выводим список } Console.WriteLine("\nRemoveRange(2, 2)"); dinosaurs.RemoveRange(2, 2); // удаляем из списка 2 элемента начиная со второго Console.WriteLine(); foreach( string dinosaur in dinosaurs ) { Console.WriteLine(dinosaur); // снова выводим список } input = new string[] { "Tyrannosaurus", "Deinonychus", "Velociraptor"};// создаём новый список строк Console.WriteLine("\nInsertRange(3, input)"); dinosaurs.InsertRange(3, input); // вставляем диапазон значений imput, начиная с третьей позиции. (0,1,2,3) Console.WriteLine(); foreach( string dinosaur in dinosaurs ) { Console.WriteLine(dinosaur); // выводим список на экран } Console.WriteLine("\noutput = dinosaurs.GetRange(2, 3).ToArray()"); string[] output = dinosaurs.GetRange(2, 3).ToArray(); // создаём массив, выбирая из списка диапазон значений длинной 3, начиная со второго элемента Console.WriteLine(); foreach( string dinosaur in output ) { Console.WriteLine(dinosaur); // выводим список на экран } } } /* This code example produces the following output: Capacity: 3 Brachiosaurus Amargasaurus Mamenchisaurus AddRange(dinosaurs) Brachiosaurus Amargasaurus Mamenchisaurus Brachiosaurus Amargasaurus Mamenchisaurus RemoveRange(2, 2) Brachiosaurus Amargasaurus Amargasaurus Mamenchisaurus InsertRange(3, input) Brachiosaurus Amargasaurus Amargasaurus Tyrannosaurus Deinonychus Velociraptor Mamenchisaurus output = dinosaurs.GetRange(2, 3).ToArray() Amargasaurus Tyrannosaurus Deinonychus */Метод AsReadOnly
Возвращает для текущей коллекции оболочку IList
Чтобы предотвратить любые изменения списка List
Коллекция, предназначенная только для чтения, — это просто коллекция с оболочкой, предотвращающей ее изменение, т. е. если в базовую коллекцию вносятся изменения, они отражаются в коллекции, доступной только для чтения.
Этот метод является операцией порядка сложности O(1).
Синтаксис
public ReadOnlyCollection<T> AsReadOnly()
Пример:
В следующем примере кода демонстрируется использование метода AsReadOnly. Создается список строк List
Элементу исходного списка присваивается значение "Coelophysis" с помощью свойства Item (индексатор в C#), и содержимое списка, доступного только для чтения, выводится вновь, демонстрируя, что это лишь оболочка исходного списка.
using System; using System.Collections.Generic; public class Example { public static void Main() { List<string> dinosaurs = new List<string>(4);// создаём список из 4 строк Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity); // Добавляем по очереди по одному элементу dinosaurs.Add("Tyrannosaurus"); dinosaurs.Add("Amargasaurus"); dinosaurs.Add("Mamenchisaurus"); dinosaurs.Add("Deinonychus"); // Выводим на экран Console.WriteLine(); foreach(string s in dinosaurs) { Console.WriteLine(s); } Console.WriteLine("\nIList<string> roDinosaurs = dinosaurs.AsReadOnly()"); IList<string> roDinosaurs = dinosaurs.AsReadOnly(); // Создаём дубликат "только для чтения" Console.WriteLine("\nElements in the read-only IList:"); // Выводим на экран foreach(string dinosaur in roDinosaurs) { Console.WriteLine(dinosaur); } Console.WriteLine("\ndinosaurs[2] = \"Coelophysis\""); dinosaurs[2] = "Coelophysis"; //изменяем в начальном списке 2-ой элемент // Выводим на экран оболочку "только для чтения" Console.WriteLine("\nElements in the read-only IList:"); foreach(string dinosaur in roDinosaurs) { Console.WriteLine(dinosaur); } } } /* This code example produces the following output: Capacity: 4 Tyrannosaurus Amargasaurus Mamenchisaurus Deinonychus IList<string> roDinosaurs = dinosaurs.AsReadOnly() Elements in the read-only IList: Tyrannosaurus Amargasaurus Mamenchisaurus Deinonychus dinosaurs[2] = "Coelophysis" Elements in the read-only IList: Tyrannosaurus Amargasaurus Coelophysis Deinonychus */
Метод BinarySearch (T)
Выполняет поиск элемента по всему отсортированному списку List
Важные моменты:
- Список List
уже должен быть отсортирован в соответствии с реализацией компаратора, в противном случае будет получен неверный результат. - Если список List
содержит несколько элементов с одинаковыми значениями, метод BinarySearch ( T ) возвращает только один элемент, причем не обязательно самый первый. - Допускается сравнение значения null с любым ссылочным типом; оно не генерирует исключение при использовании универсального интерфейса IComparable
.При сортировке значение null считается меньшим любого другого объекта. - Если List
не содержит заданного значения, метод BinarySearch ( T ) возвращает отрицательное целое число. К этому числу можно применить операцию поразрядного дополнения (~) для получения индекса первого элемента, большего, чем искомое значение.Вставка значения в список List должна производиться в позиции, заданной этим индексом, чтобы сохранить порядок сортировки. - Для определения порядка элементов списка метод BinarySearch ( T ) использует компаратор (Шаблон сравнения) по умолчанию Comparer
.Default для типа T
Перед сравнением проверяется реализован ли для данного типа данных Т шаблон сравнения Comparer.Default, и использует эту реализацию, если она доступна.
Если она недоступна,Comparer.Default проверяет, реализует ли тип T интерфейс IComparable. Если тип T не реализует эти интерфейсы,Comparer .Default генерирует исключение InvalidOperationException. - Этот метод является операцией порядка сложности O(log n), где n — количество элементов в диапазоне.
Синтаксис
public int BinarySearch (T item)
Пример:
В следующем примере кода демонстрируется перегрузка методаSort() и перегрузка методаBinarySearch(T).Создается список строк List
Затем используется перегрузка методаBinarySearch(T) для поиска двух строк, не включенных в список, и эти строки вставляются с помощью методаInsert.Возвращаемое значение методаBinarySearch(T) будет отрицательным в каждом случае, поскольку строки не входят в список.Поразрядное дополнение (оператор ~ в C# и Visual C++,Xor -1 в Visual Basic) этого отрицательного числа дает индекс первого элемента в списке, большего, чем искомая строка, и вставка в эту позицию позволяет сохранить порядок сортировки.Вторая искомая строка больше любого элемента списка, поэтому позиция вставки приходится на конец списка.
using System; using System.Collections.Generic; public class Example { public static void Main() { List<string> dinosaurs = new List<string>(); dinosaurs.Add("Pachycephalosaurus"); dinosaurs.Add("Amargasaurus"); dinosaurs.Add("Mamenchisaurus"); dinosaurs.Add("Deinonychus"); Console.WriteLine(); foreach(string dinosaur in dinosaurs) { Console.WriteLine(dinosaur); } Console.WriteLine("\n Сортируем список"); dinosaurs.Sort(); Console.WriteLine(); foreach(string dinosaur in dinosaurs) { Console.WriteLine(dinosaur); } Console.WriteLine("применяем метод BinarySearch и вставляем в найденную позицию элемент "Coelophysis":"); int index = dinosaurs.BinarySearch("Coelophysis"); if (index < 0) {dinosaurs.Insert(~index, "Coelophysis"); // ищем значение "Coelophysis", // ~index - необходимо, в случе, если нет такого элемента в списке, // тогда index будет увеличен до индекса первого элемента, большего, // чем искомое значение} Console.WriteLine(); foreach(string dinosaur in dinosaurs) { Console.WriteLine(dinosaur); } Console.WriteLine("применяем метод BinarySearch и вставляем в найденную позицию элемент "Tyrannosaurus":"); index = dinosaurs.BinarySearch("Tyrannosaurus"); if (index < 0) { dinosaurs.Insert(~index, "Tyrannosaurus"); }Console.WriteLine(); foreach(string dinosaur in dinosaurs) { Console.WriteLine(dinosaur); } } } /* Этот код показывает работу метода BinarySearch(T item): Pachycephalosaurus Amargasaurus Mamenchisaurus Deinonychus Сортируем список Amargasaurus Deinonychus Mamenchisaurus Pachycephalosaurus применяем метод BinarySearch и вставляем в найденную позицию элемент "Coelophysis": Amargasaurus Coelophysis Deinonychus Mamenchisaurus Pachycephalosaurus применяем метод BinarySearch и вставляем в найденную позицию элемент "Tyrannosaurus": Amargasaurus Coelophysis Deinonychus Mamenchisaurus Pachycephalosaurus Tyrannosaurus*/Метод BinarySearch (T, IComparer
Метод BinarySearch ( T item, IComparer
Отсчитываемый от нуля индекс элемента item в отсортированном списке List
Важные моменты:
- Компаратор определяет способ сравнения элементов.Например, для поиска строки без учета регистра в качестве компаратора можно использовать экземпляр класса CaseInsensitiveComparer.
- Если указан параметр comparer, элементы списка List
сравниваются с заданным значением с помощью указанной реализации IComparer . - Если в качестве comparer задано null, компаратор по умолчанию Comparer
.Default проверяет, реализует ли тип T универсальный интерфейс IComparable , и использует эту реализацию, если она доступна.Если она недоступна, Comparer .Default проверяет, реализует ли тип T интерфейс IComparable.Если тип T не реализует эти интерфейсы, Comparer .Default генерирует исключение InvalidOperationException. - Список List
уже должен быть отсортирован в соответствии с реализацией компаратора, в противном случае будет получен неверный результат. - Если список List
содержит несколько элементов с одинаковыми значениями, метод BinarySearch ( T item, IComparer comparer) возвращает только один элемент, причем не обязательно самый первый. - Допускается сравнение значения null с любым ссылочным типом; оно не генерирует исключение при использовании универсального интерфейса IComparable
.При сортировке значение null считается меньшим любого другого объекта. - Если List
не содержит заданного значения, метод BinarySearch ( T item, IComparer comparer) возвращает отрицательное целое число. К этому числу можно применить операцию поразрядного дополнения (~) для получения индекса первого элемента, большего, чем искомое значение.Вставка значения в список List должна производиться в позиции, заданной этим индексом, чтобы сохранить порядок сортировки. - Для определения порядка элементов списка метод BinarySearch ( T item, IComparer
comparer) использует компаратор (Шаблон сравнения) по умолчанию Comparer .Default для типа T - Перед сравнением проверяется реализован ли для данного типа данных Т шаблон сравнения Comparer
.Default, и использует эту реализацию, если она доступна. Если она недоступна,Comparer .Default проверяет, реализует ли тип T интерфейс IComparable. Если тип T не реализует эти интерфейсы,Comparer .Default генерирует исключение InvalidOperationException. - Этот метод является операцией порядка сложности O(log n), где n — количество элементов в диапазоне.
Синтаксис
public int BinarySearch (T item, IComparer<T> comparer)
Пример:
В следующем примере кода демонстрируется перегрузка метода Sort(IComparer
В примере определяется альтернативный компаратор для строк с именем DinoCompare, реализующий универсальный интерфейс IComparer
Создается список строк List
Затем используется перегрузка метода BinarySearch (T, IComparer
using System; using System.Collections.Generic; public class DinoComparer: IComparer<string> { public int Compare(string x, string y) { if (x == null) { if (y == null) { // Если x == null и y == null, то они равны return 0; } else { // Если x == null и y != null, то у больше return -1; } } else { // Если x != null... // if (y == null) // ...и y == null, то x больше. { return 1; } else { // ...и y != null, сравниваем их длину // int retval = x.Length.CompareTo(y.Length); if (retval != 0) { // Если их длины не равны, // то более длинная строка больше. // return retval; } else { // Если длины одинаковы, // сравниваем строки базовым методом // сравнения return x.CompareTo(y); } } } } } public class Example { public static void Main() { List<string> dinosaurs = new List<string>(); dinosaurs.Add("Pachycephalosaurus"); dinosaurs.Add("Amargasaurus"); dinosaurs.Add("Mamenchisaurus"); dinosaurs.Add("Deinonychus"); Display(dinosaurs); DinoComparer dc = new DinoComparer(); Console.WriteLine("\nSort with alternate comparer:"); dinosaurs.Sort(dc); Display(dinosaurs); SearchAndInsert(dinosaurs, "Coelophysis", dc); Display(dinosaurs); SearchAndInsert(dinosaurs, "Oviraptor", dc); Display(dinosaurs); SearchAndInsert(dinosaurs, "Tyrannosaur", dc); Display(dinosaurs); SearchAndInsert(dinosaurs, null, dc); Display(dinosaurs); } private static void SearchAndInsert(List<string> list, string insert, DinoComparer dc) { Console.WriteLine("\nПрименение бинарного поиска BinarySearch и вставка элемента \"{0}\":", insert); int index = list.BinarySearch(insert, dc); if (index < 0) { list.Insert(~index, insert); } } private static void Display(List<string> list) { Console.WriteLine(); foreach( string s in list ) { Console.WriteLine(s); } } }/* Это пример работы вышенаписанной программы:Pachycephalosaurus Amargasaurus Mamenchisaurus Deinonychus Сортировка сторонним (своим) шаблоном сравнения:Deinonychus Amargasaurus Mamenchisaurus Pachycephalosaurus //Применение бинарного поиска BinarySearch и //вставка элемента "Coelophysis":Coelophysis Deinonychus Amargasaurus Mamenchisaurus Pachycephalosaurus //Применение бинарного поиска BinarySearch и //вставка элемента "Oviraptor":Oviraptor Coelophysis Deinonychus Amargasaurus Mamenchisaurus Pachycephalosaurus //Применение бинарного поиска BinarySearch и //вставка элемента "Tyrannosaur":Oviraptor Coelophysis Deinonychus Tyrannosaur Amargasaurus Mamenchisaurus Pachycephalosaurus Применение бинарного поиска BinarySearch и //вставка элемента "":Oviraptor Coelophysis Deinonychus Tyrannosaur Amargasaurus Mamenchisaurus Pachycephalosaurus */Метод Clear()
Удаляет все элементы из коллекции List
Особенности и примечания:
1. Свойству Count присваивается значение 0, и из элементов коллекции удаляются ссылки на другие объекты.
2. Значение свойства Capacity не изменяется. Чтобы сбросить емкость списка List
3. Этот метод является операцией порядка сложности O(n), где n равно Count.
Синтаксис
public void Clear()
Пример:
В следующем примере кода демонстрируется метод Clear и ряд других свойств и методов универсального класса List
using System;
using System.Collections.Generic;
public class Example
{
public static void Main()
{
List
Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity);
dinosaurs.Add("Tyrannosaurus");
dinosaurs.Add("Amargasaurus");
dinosaurs.Add("Mamenchisaurus");
dinosaurs.Add("Deinonychus"); dinosaurs.Add("Compsognathus");
Console.WriteLine(); foreach (string dinosaur in dinosaurs) { Console.WriteLine(dinosaur); }
Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity);
Console.WriteLine("Count: {0}", dinosaurs.Count);
Console.WriteLine("\nContains(\"Deinonychus\"): {0}",
dinosaurs.Contains("Deinonychus"));
Console.WriteLine("\nInsert(2, \"Compsognathus\")");
dinosaurs.Insert(2, "Compsognathus"); // вставляем во вторую позицию элемент "Compsognathus"
Console.WriteLine();
foreach (string dinosaur in dinosaurs)
{
Console.WriteLine(dinosaur);
}
Console.WriteLine("\ndinosaurs[3]: {0}", dinosaurs[3]);
Console.WriteLine("\nRemove(\"Compsognathus\")");
dinosaurs.Remove("Compsognathus"); // удаляем элемент "Compsognathus"
Console.WriteLine(); foreach (string dinosaur in dinosaurs) { Console.WriteLine(dinosaur); }
dinosaurs.TrimExcess(); // очищаем ёмкость списка
Console.WriteLine("\nTrimExcess()");
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
Console.WriteLine("Count: {0}", dinosaurs.Count);
dinosaurs.Clear(); // очищаем сам список
Console.WriteLine("\nClear()");
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
Console.WriteLine("Count: {0}", dinosaurs.Count);
}
}
/* This code example produces the following output:
Capacity: 0
Tyrannosaurus
Amargasaurus
Mamenchisaurus
Deinonychus
Compsognathus
Capacity: 8
Count: 5
Contains("Deinonychus"): True
Insert(2, "Compsognathus")
Tyrannosaurus
Amargasaurus
Compsognathus
Mamenchisaurus
Deinonychus
Compsognathus
dinosaurs[3]: Mamenchisaurus
Remove("Compsognathus")
Tyrannosaurus
Amargasaurus
Mamenchisaurus
Deinonychus
Compsognathus TrimExcess()
Capacity: 5 Count: 5 Clear()
Capacity: 5
Count: 0
*/