Как использовать библиотеку list в с
Итак, класс ArrayList представляет коллекцию объектов. И если надо сохранить вместе разнотипные объекты — строки, числа и т.д., то данный класс как раз для этого подходит.
Основные методы класса:
- int Add(object value) : добавляет в список объект value
- void AddRange(ICollection col) : добавляет в список объекты коллекции col, которая представляет интерфейс ICollection — интерфейс, реализуемый коллекциями.
- void Clear() : удаляет из списка все элементы
- bool Contains(object value) : проверяет, содержится ли в списке объект value. Если содержится, возвращает true, иначе возвращает false
- void CopyTo(Array array) : копирует текущий список в массив array.
- ArrayList GetRange(int index, int count) : возвращает новый список ArrayList, который содержит count элементов текущего списка, начиная с индекса index
- int IndexOf(object value) : возвращает индекс элемента value
- void Insert(int index, object value) : вставляет в список по индексу index объект value
- void InsertRange(int index, ICollection col) : вставляет в список начиная с индекса index коллекцию ICollection
- int LastIndexOf(object value) : возвращает индекс последнего вхождения в списке объекта value
- void Remove(object value) : удаляет из списка объект value
- void RemoveAt(int index) : удаляет из списка элемент по индексу index
- void RemoveRange(int index, int count) : удаляет из списка count элементов, начиная с индекса index
- void Reverse() : переворачивает список
- void SetRange(int index, ICollection col) : копирует в список элементы коллекции col, начиная с индекса index
- void Sort() : сортирует коллекцию
Кроме того, с помощью свойства Count можно получить количество элементов в списке.
Посмотрим применение класса на примере.
using System; using System.Collections; namespace Collections < class Program < static void Main(string[] args) < ArrayList list = new ArrayList(); list.Add(2.3); // заносим в список объект типа double list.Add(55); // заносим в список объект типа int list.AddRange(new string[] < "Hello", "world" >); // заносим в список строковый массив // перебор значений foreach (object o in list) < Console.WriteLine(o); >// удаляем первый элемент list.RemoveAt(0); // переворачиваем список list.Reverse(); // получение элемента по индексу Console.WriteLine(list[0]); // перебор значений for (int i = 0; i < list.Count; i++) < Console.WriteLine(list[i]); >Console.ReadLine(); > > >
Во-первых, так как класс ArrayList находится в пространстве имен System.Collections, то подключаем его ( using System.Collections; ).
Вначале создаем объект коллекции через конструктор как объект любого другого класса: ArrayList list = new ArrayList(); . При необходимости мы могли бы так же, как и с массивами, выполнить начальную инициализацию коллекции, например, ArrayList list = new ArrayList();
Далее последовательно добавляем разные значения. Данный класс коллекции, как и большинство других коллекций, имеет два способа добавления: одиночного объекта через метод Add и набора объектов, например, массива или другой коллекции через метод AddRange
Через цикл foreach мы можем пройтись по всем объектам списка. И поскольку данная коллекция хранит разнородные объекты, а не только числа или строки, то в качестве типа перебираемых объектов выбран тип object: foreach (object o in list)
Многие коллекции, в том числе и ArrayList, реализуют удаление с помощью методов Remove/RemoveAt. В данном случае мы удаляем первый элемент, передавая в метод RemoveAt индекс удаляемого элемента.
В завершении мы опять же выводим элементы коллекции на экран только уже через цикл for. В данном случае с перебором коллекций дело обстоит также, как и с массивами. А число элементов коллекции мы можем получить через свойство Count
С помощью индексатора мы можем получить по индексу элемент коллекции так же, как и в массивах: object firstObj = list[0];
Что такое List в C#?
Динамические массивы или коллекции — хороши тем, что нам не надо указывать сколько в них будет элементов. Кроме того, мы можем с легкостью удалять элементы, добавлять новые и выполнять полное удаление всех элементов. Программам обычно необходимо выделять больше памяти на такие массивы.
Списки (List) в языке C# представляют собой динамически расширяемые коллекции, спроектированные для хранения и управления набором элементов. Они предоставляют удобные методы для добавления, удаления и доступа к элементам коллекции.
Для создания динамического массива необходимо подключить специальную библиотеку, которая отвечает за это.
using System.Collections.Generic;
После этого мы можем их использовать. Изначально такие массивы создаются без каких-либо элементов в них, так как потом их можно добавить при помощи метода Add .
List words = new List (); words.Add ("Простые слова,"); words.Add ("но они являются"); words.Add ("элементами массива"); // Вывод элементов списка foreach (int item in myList) Console.WriteLine(item);
Как использовать LINQ для заполнения List
Здравствуйте!
Подскажите пожалуйста, как переписать функцию GetValues() с помощью LINQ.
И если дадите дельную ссылку на изучение LINQ(кроме MSDN), буду благодарен. Вот код:
enum MyEnum < FIRST, SECOND >; class MyClass < ListMyList = new List(); //constructor internal MyClass() < MyList.Add(new MyObject(MyEnum.FIRST, 1)); MyList.Add(new MyObject(MyEnum.FIRST, 2)); MyList.Add(new MyObject(MyEnum.FIRST, 3)); MyList.Add(new MyObject(MyEnum.SECOND, 1)); ListcollectedValues = GetValues(MyList, MyEnum.SECOND); > List GetValues(List MyList, MyEnum ExceptionEnum) < ListreturnList = new List(); for(int i = 0; i < MyList.Count; i++) < if(MyList[i].MyName == ExceptionEnum) continue; returnList.Add(MyList[i].Value); >return returnList; > > class MyObject < internal MyEnum MyName; internal int Value; public MyObject(MyEnum MyName, int Value) < this.MyName = MyName; this.Value = Value; >>
Отслеживать
задан 5 мая 2017 в 13:37
339 2 2 серебряных знака 10 10 бронзовых знаков
Вряд ли найдется что-то лучше чем MSDN
5 мая 2017 в 13:57
5 мая 2017 в 14:06
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
List GetValues(List MyList, MyEnum ExceptionEnum) < return MyList.Where(i =>i.MyName != ExceptionEnum).Select(i => i.Value).ToList(); >
if(MyList[i].MyName == ExceptionEnum) continue; returnList.Add(MyList[i].Value);
if(MyList[i].MyName != ExceptionEnum) returnList.Add(MyList[i].Value);
И отсюда следует, что нам надо взять все элементы из MyList , где MyListItem.MyName != ExceptionEnum . Тут нам приходит на помощь Where-clause . Далее проходим и вытягиваем Value из каждого элемента с помощью Select-clause . И в конце просто конвертим IEnumerable в List с помощью ToList() .
Насчет изучения LINQ, то посоветую сайт товарища Метанита.
Коллекции
Хотя в языке C# есть массивы, которые хранят в себе наборы однотипных объектов, но работать с ними не всегда удобно. Например, массив хранит фиксированное количество объектов, однако что если мы заранее не знаем, сколько нам потребуется объектов. И в этом случае намного удобнее применять коллекции. Еще один плюс коллекций состоит в том, что некоторые из них реализует стандартные структуры данных, например, стек, очередь, словарь, которые могут пригодиться для решения различных специальных задач. Большая часть классов коллекций содержится в пространстве имен System.Collections.Generic .
Класс List из пространства имен System.Collections.Generic представляет простейший список однотипных объектов. Класс List типизируется типом, объекты которого будут хранится в списке.
Мы можем создать пустой список:
List people = new List();
В данном случае объект List типизируется типом string . А это значит, что хранить в этом списке мы можем только строки.
Можно сразу при создании списка инициализировать его начальными значениями. В этом случае элементы списка помещаются после вызова конструктора в фигурных скобках
List people = new List() < "Tom", "Bob", "Sam" >;
В данном случае в список помещаются три строки
Также можно при создании списка инициализировать его элементами из другой коллекции, например, другого списка:
var people = new List() < "Tom", "Bob", "Sam" >; var employees = new List(people);
Можно совместить оба способа:
var people = new List() < "Tom", "Bob", "Sam" >; var employees = new List(people);
В данном случае в списке employees будет четыре элемента ( < "Tom", "Bob", "Sam", "Mike" >) — три добавляются из списка people и один элемент задается при инициализации.
Начиная с версии C# 12 для определения списков можно использовать выражения коллекций, которые предполагают заключение элементов коллекции в квадратные скобки:
List people = ["Tom", "Bob", "Sam"]; List employees = [];// пустой список
Подобным образом можно работать со списками других типов, например:
List people = new List() < new Person("Tom"), new Person("Bob"), new Person("Sam") >; class Person < public string Name < get;>public Person(string name) => Name = name; >
Установка начальной емкости списка
Еще один конструктор класса List принимает в качестве параметра начальную емкость списка:
List people = new List(16);
Указание начальной емкости списка позволяет в будущем увеличить производительность и уменьшить издержки на выделение памяти при добавлении элементов. Поскольку динамическое добавление в список может приводить на низком уровне к дополнительному выделению памяти, что снижает производительность. Если же мы знаем, что список не будет превышать некоторый размер, то мы можем передать этот размер в качестве емкости списка и избежать дополнительных выделений памяти.
Также начальную емкость можно установить с помощью свойства Capacity , которое имеется у класса List.
Обращение к элементам списка
Как и массивы, списки поддерживают индексы, с помощью которых можно обратиться к определенным элементам:
var people = new List() < "Tom", "Bob", "Sam" >; string firstPerson = people[0]; // получаем первый элемент Console.WriteLine(firstPerson); // Tom people[0] = "Mike"; // изменяем первый элемент Console.WriteLine(people[0]); // Mike
Длина списка
С помощью свойства Count можно получить длину списка:
var people = new List() < "Tom", "Bob", "Sam" >; Console.WriteLine(people.Count); // 3
Перебор списка
C# позволяет осуществить перебор списка с помощью стандартного цикла foreach :/p>
var people = new List() < "Tom", "Bob", "Sam" >; foreach (var person in people) < Console.WriteLine(person); >// Вывод программы: // Tom // Bob // Sam
Также можно использовать другие типы циклов и в комбинации с индексами перебирать списки:
var people = new List() < "Tom", "Bob", "Sam" >; for (int i = 0; i
Методы списка
Среди его методов можно выделить следующие:
- void Add(T item) : добавление нового элемента в список
- void AddRange(IEnumerable collection) : добавление в список коллекции или массива
- int BinarySearch(T item) : бинарный поиск элемента в списке. Если элемент найден, то метод возвращает индекс этого элемента в коллекции. При этом список должен быть отсортирован.
- void CopyTo(T[] array) : копирует список в массив array
- void CopyTo(int index, T[] array, int arrayIndex, int count) : копирует из списка начиная с индекса index элементы, количество которых равно count, и вставляет их в массив array начиная с индекса arrayIndex
- bool Contains(T item) : возвращает true , если элемент item есть в списке
- void Clear() : удаляет из списка все элементы
- bool Exists(Predicate match) : возвращает true , если в списке есть элемент, который соответствует делегату match
- T? Find(Predicate match) : возвращает первый элемент, который соответствует делегату match. Если элемент не найден, возвращается null
- T? FindLast(Predicate match) : возвращает последний элемент, который соответствует делегату match. Если элемент не найден, возвращается null
- List FindAll(Predicate match) : возвращает список элементов, которые соответствуют делегату match
- int IndexOf(T item) : возвращает индекс первого вхождения элемента в списке
- int LastIndexOf(T item) : возвращает индекс последнего вхождения элемента в списке
- List GetRange(int index, int count) : возвращает список элементов, количество которых равно count, начиная с индекса index.
- void Insert(int index, T item) : вставляет элемент item в список по индексу index. Если такого индекса в списке нет, то генерируется исключение
- void InsertRange(int index, collection) : вставляет коллекцию элементов collection в текущий список начиная с индекса index. Если такого индекса в списке нет, то генерируется исключение
- bool Remove(T item) : удаляет элемент item из списка, и если удаление прошло успешно, то возвращает true. Если в списке несколько одинаковых элементов, то удаляется только первый из них
- void RemoveAt(int index) : удаление элемента по указанному индексу index. Если такого индекса в списке нет, то генерируется исключение
- void RemoveRange(int index, int count) : параметр index задает индекс, с которого надо удалить элементы, а параметр count задает количество удаляемых элементов.
- int RemoveAll((Predicate match)) : удаляет все элементы, которые соответствуют делегату match. Возвращает количество удаленных элементов
- void Reverse() : изменяет порядок элементов
- void Reverse(int index, int count) : изменяет порядок на обратный для элементов, количество которых равно count, начиная с индекса index
- void Sort() : сортировка списка
- void Sort(IComparer? comparer) : сортировка списка с помощью объекта comparer, который передается в качестве параметра
Добавление в список
List people = new List () < "Tom" >; people.Add("Bob"); // добавление элемента // people = < "Tom", "Bob" >; people.AddRange(new[] < "Sam", "Alice" >); // добавляем массив // people = < "Tom", "Bob", "Sam", "Alice" >; // также можно было бы добавить другой список // people.AddRange(new List()< "Sam", "Alice" >); people.Insert(0, "Eugene"); // вставляем на первое место // people = < "Eugene", "Tom", "Bob", "Sam", "Alice" >; people.InsertRange(1, new string[] ); // вставляем массив с индекса 1 // people = < "Eugene", "Mike", "Kate", "Tom", "Bob", "Sam", "Alice" >; // также можно было бы добавить другой список // people.InsertRange(1, new List()< "Mike", "Kate" >);
Удаление из списка
var people = new List () < "Eugene", "Mike", "Kate", "Tom", "Bob", "Sam", "Tom", "Alice" >; people.RemoveAt(1); // удаляем второй элемент // people = < "Eugene", "Kate", "Tom", "Bob", "Sam", "Tom", "Alice" >; people.Remove("Tom"); // удаляем элемент "Tom" // people = < "Eugene", "Kate", "Bob", "Sam", "Tom", "Alice" >; // удаляем из списка все элементы, длина строки которых равна 3 people.RemoveAll(person => person.Length == 3); // people = < "Eugene", "Kate", "Alice" >; // удаляем из списка 2 элемента начиная с индекса 1 people.RemoveRange(1, 2); // people = < "Eugene">; // полностью очищаем список people.Clear(); // people = < >;
Поиск и проверка элемента
var people = new List () < "Eugene", "Mike", "Kate", "Tom", "Bob", "Sam" >; var containsBob = people.Contains(«Bob»); // true var containsBill = people.Contains(«Bill»); // false // проверяем, есть ли в списке строки с длиной 3 символа var existsLength3 = people.Exists(p => p.Length == 3); // true // проверяем, есть ли в списке строки с длиной 7 символов var existsLength7 = people.Exists(p => p.Length == 7); // false // получаем первый элемент с длиной в 3 символа var firstWithLength3 = people.Find(p => p.Length == 3); // Tom // получаем последний элемент с длиной в 3 символа var lastWithLength3 = people.FindLast(p => p.Length == 3); // Sam // получаем все элементы с длиной в 3 символа в виде списка List peopleWithLength3 = people.FindAll(p => p.Length == 3); // peopleWithLength3
Получение диапазона и копирование в массив
List people = new List() ; // получаем диапазон со второго по четвертый элемент var range = people.GetRange(1, 3); // range = < "Tom", "Mike", "Sam">; // копируем в массив первые три элемента string[] partOfPeople = new string[3]; people.CopyTo(0, partOfPeople, 0, 3); // partOfPeople = < "Eugene", "Tom", "Mike">;
Расположение элементов в обратном порядке
var people = new List () < "Eugene", "Tom", "Mike", "Sam", "Bob" >; // переворачиваем весь список people.Reverse(); // people = < "Bob","Sam", "Mike", "Tom", "Eugene">; var people2 = new List() < "Eugene", "Tom", "Mike", "Sam", "Bob" >; // переворачиваем часть только 3 элемента с индекса 1 people2.Reverse(1, 3); // people2 = < "Eugene","Sam", "Mike", "Tom", "Bob" >;