Как использовать IEnumerable, ICollection, IList и IQueryable в C#

автор vadim


Язык программирования C# обеспечивает отличную поддержку работы с коллекциями данных. C# включает несколько классов и интерфейсов, которые помогут эффективно запрашивать коллекции данных. Наиболее часто используемые интерфейсы для работы с коллекциями — IEnumerable, ICollection, IList и IQueryable.

В этой статье мы рассмотрим каждый из этих интерфейсов и обсудим, как мы можем работать с ними в .NET 8, иллюстрируя это примерами кода.

Создайте проект консольного приложения в Visual Studio.

Прежде всего давайте создадим проект консольного приложения .NET Core в Visual Studio. Предполагая, что в вашей системе установлена ​​Visual Studio 2022, выполните действия, описанные ниже, чтобы создать новый проект консольного приложения .NET Core.

  1. Запустите интегрированную среду разработки Visual Studio.
  2. Нажмите «Создать новый проект».
  3. В окне «Создать новый проект» выберите «Консольное приложение (.NET Core)» из списка отображаемых шаблонов.
  4. Нажмите “Далее.
  5. В окне «Настроить новый проект» укажите имя и местоположение нового проекта.
  6. Нажмите “Далее.
  7. В следующем окне «Дополнительная информация» выберите «.NET 8.0 (долгосрочная поддержка)» в качестве версии платформы, которую вы хотите использовать.
  8. Нажмите Создать.

Мы будем использовать этот проект консольного приложения .NET 8 для работы с интерфейсами IEnumerable, ICollection, IList и IQueryable в последующих разделах этой статьи.

Интерфейс IEnumerable в C#

Интерфейс IEnumerable в C# позволяет перебирать коллекцию элементов. Он содержит один метод GetEnumerator, который возвращает экземпляр типа IEnumerable. Этот экземпляр можно использовать для перебора коллекции элементов только для чтения и только для пересылки. Вы не можете использовать IEnumerable для итерации в обратном направлении.

Интерфейс IEnumerable определен в пространстве имен System.Collections, как показано ниже.

public interface IEnumerable<out T> : IEnumerable
{
    new IEnumerator<T> GetEnumerator();
}

В следующем фрагменте кода показано, как можно работать с IEnumerable в C#.

List<string> cities = new List<string>() { "New York", "London", "Tokyo", "Lisbon", "Hyderabad", "Chicago" };
IEnumerable<string> query = cities.Where(x => x.StartsWith("L"));
foreach (var city in query)
{
    Console.WriteLine(city);
}

Когда вы выполните предыдущий фрагмент кода, в окне консоли отобразятся названия городов, начинающиеся с буквы «L».

Интерфейс ICollection в C#

Интерфейс ICollection — это базовый интерфейс всех классов, относящихся к пространству имен System.Collections. Он предоставляет общую коллекцию объектов, элементы которой доступны с помощью индекса.

Интерфейс ICollection является универсальным эквивалентом интерфейса ICollection. Он расширяет интерфейс IEnumerable, который, в свою очередь, расширяет интерфейс IEnumerable, как показано в приведенном ниже фрагменте кода.

public interface ICollection<T> : IEnumerable<T>
{     
        int Count { get; }
        bool IsReadOnly { get; }
        void Add(T item);
        void Clear();
        bool Contains(T item);
        void CopyTo(T[] array, int arrayIndex);
        bool Remove(T item);
}

В отличие от интерфейса IEnumerable, интерфейс ICollection позволяет добавлять или удалять элементы из коллекции. В следующем фрагменте кода показано, как можно использовать интерфейс ICollection в C#.

ICollection<string> countries = new Collection<string>();
countries.Add("USA");
countries.Add("India");
countries.Add("England");
countries.Add("Japan");
foreach (string country in countries)
{
    Console.WriteLine(country);
}

Когда вы выполните приведенный выше код, названия стран, добавленные в коллекцию, будут отображаться в окне консоли.

Интерфейс IList в C#

Интерфейс IList доступен в пространстве имен System.Collections. Он представляет собой строго типизированную коллекцию, элементы которой доступны с помощью индекса. IList расширяет интерфейс ICollection и содержит дополнительные методы, такие как IndexOf, Insert и RemoveAt, для работы с коллекциями.

В следующем фрагменте кода показано, как интерфейс IList определяется в пространстве имен System.Collections.

public interface IList : ICollection
    {
        Object this[int index] {
            get;
            set;
        }
        int Add(Object value); 
        bool Contains(Object value);
        void Clear();
        bool IsReadOnly
        { get; }
         bool IsFixedSize
        {
            get;
        }
        int IndexOf(Object value); 
        void Insert(int index, Object value); 
        void Remove(Object value); 
        void RemoveAt(int index);
    }

В приведенном ниже фрагменте кода показано, как можно создать экземпляр типа IList, а также добавлять и удалять элементы из коллекции.

IList<string> customers = new List<string>();
customers.Add("Joydip");
customers.Add("Steve");
customers.Add("Peter");
customers.Insert(2, "Michael");
customers.RemoveAt(0);
for (int i = 0; i < customers.Count; i++)
{
    Console.WriteLine(customers[i]);
}

Обратите внимание, что имя клиента было вставлено в коллекцию, а имя клиента в начале коллекции было удалено. Когда вы выполните предыдущий фрагмент кода, имена, присутствующие в обновленной коллекции, будут отображаться в окне консоли, как показано на рисунке 1.

илист в до-диез ИДГ

Рисунок 1. Пример IList на C#.

Интерфейс IQueryable в C#

Интерфейс IQueryable, относящийся к пространству имен System.Linq, расширяет интерфейс IEnumerable и может использоваться для запроса данных из источников данных, реализующих поставщиков IQueryable. Интерфейс IQueryable расширяет интерфейс IEnumerable и определяется, как показано в приведенном ниже фрагменте кода.

public interface IQueryable<out T> : IEnumerable<T>, IQueryable
{
}

В то время как интерфейс IEnumerable можно использовать для работы с коллекциями данных в памяти, интерфейс IQueryable можно использовать с внешними источниками данных, такими как веб-служба или база данных. Рассмотрим следующий класс.

public class Author
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool IsActive { get; set; }
}

В следующем фрагменте кода показано, как можно работать с интерфейсом IQueryable в C#.

List<Author> authors = new List<Author>()
{
    new Author(){Id = 1, FirstName = "Joydip", LastName = "Kanjilal", IsActive = true},
    new Author(){Id = 2, FirstName = "Michael", LastName = "Smith", IsActive = false},
    new Author(){Id = 3, FirstName = "Steve", LastName = "Jones", IsActive = true}
};
IQueryable<Author> query = authors.AsQueryable()
                                 .Where(a => a.IsActive == true);
foreach (var author in query)
{
    Console.WriteLine($"Id : {author.Id}  FirstName : {author.FirstName}    LastName : {author.LastName}");
}

Интерфейс IQueryable подходит для работы с большими наборами данных, особенно если вам нужно реализовать разбиение по страницам для получения только тех данных, которые вам нужны.

Какой интерфейс сбора данных следует использовать?

Ниже приведен краткий обзор функций интерфейсов IEnumerable, ICollection, IList и IQueryable.

  • IEnumerable позволяет получать доступ к элементам коллекции только для чтения и только для прямого доступа. Запрещается добавлять, удалять или изменять элементы.
  • ICollection наследует интерфейс IEnumerable и предоставляет дополнительные функции, включая добавление, удаление и изменение элементов.
  • IList расширяет интерфейс ICollection и представляет строго типизированные коллекции, доступные через индекс. Таким образом, помимо добавления, удаления и изменения вы можете вставлять или удалять элементы, используя значения индекса.
  • IQueryable расширяет интерфейс IEnumerable, обеспечивает поддержку LINQ и хорошо подходит для работы с большими наборами данных. Когда вы используете IQueryable с LINQ to SQL или LINQ to Entities, он генерирует выражение LINQ to SQL, которое выполняется на уровне данных вашего приложения.

Выбор интерфейса коллекции в C# будет зависеть от требований вашего приложения. Если вы хотите запросить данные из базы данных, используйте IQueryable. Если вы хотите запросить данные из памяти, используйте IEnumerable, ICollection или IList, в зависимости от того, что вы хотите делать с элементами коллекции.

Дальше читайте это:

  • Лучшее программное обеспечение с открытым исходным кодом 2023 года
  • Сертификаты программирования все еще имеют значение?
  • Облачные вычисления больше не являются пустяком
  • Что такое генеративный ИИ? Искусственный интеллект, который создает
  • Программирование с помощью ИИ: советы и лучшие практики от разработчиков
  • Почему Wasm — это будущее облачных вычислений

Related Posts

Оставить комментарий