Count number of element in List<List<T>>
I have a List<List<T>> . How can I count all the elements in this as if it was a single List<T> in the fastest way?
So far I have used
but this actually creates a list and then counts the element which is not a very good idea.
4 Answers 4
By using LINQ, I think your code is good with a bit changes that no need for .ToList() , just call Count() extension as the following:
I would recommend a simple, nested loop with a HashSet if you need to eliminate duplicates between lists. It combines the SelectMany and Distinct operations into the set insertion logic and should be faster since the HashSet has O(1) lookup time. Internally Distinct() may actually use something similar, but this omits the construction of the single list entirely.
To count all the elements in all the lists in the list, you could use the aggregating operators:
I’d like to get the chance to answer this question just to highlight when we should use linq and when a classic for. Unfortunately today people doesn’t care a lot about performance as we got use to work on very powerful computer. Anyway just try the code below and you will discover that Linq is more then 100 times slower than the classic for version. You should use Linq only when the expression you need to write is really complex and you want make it more readable. I didn’t spend time to the solution shoed below as I’d like to focus on the performance
distinct version using for (just for example). In this case I have create a very «bottleneck» function that does the distinct and it is still faster.
Получить подсчет количества элементов в списке в C#
В этом посте будет обсуждаться, как получить количество элементов в списке в C#.
The Count Свойство возвращает количество элементов, содержащихся в списке. Это работает в O(1) времени и может использоваться следующим образом:
результат:
The number of elements in the list is 5
В LINQ вы можете использовать Count() метод расширения для получения количества элементов, как показано в следующем примере. Обратите внимание, что это может означать вызов метода List. Count имущество.
результат:
The number of elements in the list is 5
В качестве альтернативы, чтобы получить количество одного элемента, отфильтруйте список, используя Where() метод для получения совпадающих значений с указанной целью, а затем получить его количество, вызвав метод Count() метод.
Универсальный список List
В C# для хранения набора однотипных элементов можно использовать массивы. Однако, что мы будем делать, если заранее не известно какое количество элементов нам необходимо хранить? Или же, количество элементов может постоянно меняться? Каждый раз создавать новый массив и копировать данные из одного массива в другой — не совсем правильный вариант. В таких случаях, наиболее удобно и правильно использовать универсальный список List<T> .
Класс List<T>
Класс List<T> представляет собой простейший универсальный список для хранения однородных объектов. Размер List<T> может динамически изменяться, а доступ к элементам списка осуществляется по целочисленному индексу. Ниже представлены основные свойства и методы List<T> :
- Метод void Add(T item) — добавление нового элемента в список
- Метод void AddRange(ICollection collection) — добавление в список коллекции или массива
- Метод int BinarySearch(T item) — бинарный поиск элемента в списке. Если элемент найден, то метод возвращает индекс этого элемента в коллекции. При этом список должен быть отсортирован.
- Метод int IndexOf(T item) — возвращает индекс первого вхождения элемента в списке
- Метод void Insert(int index, T item) — вставляет элемент item в списке на позицию index
- Метод bool Remove(T item) — удаляет элемент item из списка, и если удаление прошло успешно, то возвращает true
- Метод void RemoveAt(int index) — удаление элемента по указанному индексу index
- Метод void Sort() — сортировка списка
- Свойство Capacity — возвращает или задает общее число элементов, которые может вместить внутренняя структура данных без изменения размера
- Свойство Count — получает число элементов, содержащихся списке.
- Свойство Item[Int32] — возвращает или задает элемент по указанному индексу.
Как и в случае с любым универсальным типом, T — это любой тип данных, который будет использоваться при работе со списком, например, можно создать список строк:
Рассмотрим работу со списком List<T> на примере.
Пример создания и использования списка List<T> в C#
Результат работы программы будет следующий:
Во-первых, стоит обратить внимание на создание списка — здесь мы использовали конструктор с параметром в котором передели начальное значение емкости внутреннего хранилища списка (два элемента). После этого мы добавили в список не два, а пять элементов. Как можно увидеть, никаких ошибок программа не выдала, а в список попали все пять элементов и мы смогли их перечислить в цикле, а второй элемент вывести отдельно. При этом, свойство Capacity также автоматически изменилось и стало равным восьми.
Здесь может возникнуть сразу два закономерных вопроса:
- Зачем нам необходимо свойство Capacity у List<T> , если размер списка и так динамически изменяется?
- Что произойдет, если установить значение Capacity меньше, чем текущее количество элементов в списке?
Начнем со второго вопроса. Перепишем нашу программу следующим образом:
Как только мы запустим приложение, то сразу же получим исключение:
Отсюда следует, что, во-первых, нельзя устанавливать значение Capacity меньше, чем текущее количество элементов в списке и, во-вторых, для избежания исключительных ситуаций, свойство Capacity наиболее безопасно устанавливать ДО начала добавления элементов в список.
Что касается того, зачем нам, в принципе, необходимо свойство Capacity , то здесь нам поможет следующий пример:
Здесь мы создаем очень-очень большой список строк и наполняем его значениями в цикле, а затем — выводим затраченное время в консоль. Результат работы будет следующим:
Теперь перепишем нашу программу и при создании списка укажем ему сразу начальную емкость:
Как видно из результатов, даже при использовании списка с достаточно простыми типами данных (в нашем случае — это string ), начальное указание емкости хранилища позволяет сэкономить время работы программы, так как нам уже не потребуется динамически менять размеры внутреннего хранилища списка.
Также стоит отметить, что при динамическом изменении размера списка свойство Capacity изменяется на значение равному степени двойки, т.е. 2, 4, 8, 16 и т.д, что, опять же приводит к использованию лишней памяти нашей программой. Если вам необходимо, чтобы размер внутреннего хранилища соответствовал реальному количеству элементов в списке, необходимо использовать метод TrimExcess() , например:
Итого
Сегодня мы рассмотрели основные моменты по работе со списком List<T> в C#, научились создавать список, выводить значения из списка в консоль, а также разобрались с тем, зачем нам необходимо свойство Capacity и как его использовать.
C# List Length – How to get (and set) the Length of a List in C#
On the face of it, this is a really easy one: just use List.Count:
Simple Example of getting List Length using List.Count in C#
Length Vs Count in C#
It’s common to use Arrays before using Lists (at least if you’re as old as I am!) so it often feels natural to use Length. That said, Length is not very widely available – it’s usually seen on Arrays and Strings:
List Count vs Capacity
List.Count will tell you how many items there are in your list, while List.Capacity gets (and sets) the number of items the list can hold without resizing.
For as a background, it’s worth reminding ourselves that Lists (unlike arrays) will resize dynamically – that is you can keep adding items to a list and it will grow to allow the items to fit. Capacity is added in chunks (powers of 2), so that resizing happens occasionally (not every time an element is added):
Setting the capacity of an array in C#
It’s also possible to control the capacity of a List manually, either when the List is initialised (as in this example where we set the capacity to 10):
Or after initialisation, as in this example where we set it to 20:
When setting the capacity, it might be tempting to set it to a value smaller than the list’s current size. Don’t do it – this will result in an exception being thrown at runtime:
ICollection Count property
List isn’t the only datatype in C# to have a Count property, in fact every type that implements the ICollection interface has a count property, some notable examples include: Dictionary, HashSet and SortedSet. A more complete list is available in the ICollection docs.
IEnumerable Count() method
There is another, more generic (implemented by more diverse objects) option – that’s to use the Linq IEnumerable.Count() method:
Note the line at the top saying “using System.Linq” – you’ll get an error if you don’t include that.
This method is more widely available than either the Length or Count properties, but it can be much slower. For more in depth discussion on Count vs Count() you can see my post on the subject: C# Linq Count
Leave a Reply Cancel reply
About This Site
report this ad I’m a Senior C# Developer at a hedge fund in London, UK. I started this blog to help others learn from my mistakes, while pushing the limits of my own knowledge. You can also expect some SQL and devops – particularly kubernetes.