Преобразование типов данных (C#)

Методы преобразования изменяют тип входных объектов.

Операции преобразования в запросах LINQ полезны в различных приложениях. Ниже приводятся некоторые примеры.

  • Метод Enumerable.AsEnumerable можно использовать, чтобы скрыть настраиваемую реализацию типа стандартного оператора запроса.
  • Метод Enumerable.OfType позволяет использовать непараметризованные коллекции для запросов LINQ.
  • Методы Enumerable.ToArray, Enumerable.ToDictionary, Enumerable.ToList и Enumerable.ToLookup можно использовать для принудительного немедленного выполнения запроса, не дожидаясь, пока этот запрос будет перечислен.

Методы

В следующей таблице перечислены методы стандартных операторов запросов, выполняющие преобразование типов данных.

Методы преобразования в этой таблице, имена которых начинаются с "As", изменяют статический тип исходной коллекции, но не перечисляют его. Методы, имена которых начинаются с "To", перечисляют исходную коллекцию и помещают элементы в соответствующий тип коллекции.

Имя метода Description Синтаксис выражения запроса C# Дополнительные сведения
AsEnumerable Возвращает входное значение, типизированное как IEnumerable<T>. Неприменимо. Enumerable.AsEnumerable
AsQueryable Преобразует IEnumerable (универсальный шаблон) в IQueryable (универсальный шаблон). Неприменимо. Queryable.AsQueryable
Cost Приводит элементы коллекции к указанному типу. Используйте явно типизированную переменную диапазона. Например:

from string str in words
Enumerable.Cast

Queryable.Cast
OfType Фильтрует значения в зависимости от возможности их приведения к указанному типу. Неприменимо. Enumerable.OfType

Queryable.OfType
ToArray Преобразует коллекцию в массив. Этот метод принудительно выполняет запрос. Неприменимо. Enumerable.ToArray
ToDictionary Помещает элементы в Dictionary<TKey,TValue> в зависимости от функции выбора ключа. Этот метод принудительно выполняет запрос. Неприменимо. Enumerable.ToDictionary
ToList Преобразует коллекцию в List<T>. Этот метод принудительно выполняет запрос. Неприменимо. Enumerable.ToList
ToLookup Помещает элементы в Lookup<TKey,TElement> (словарь "один ко многим") в зависимости от функции выбора ключа. Этот метод принудительно выполняет запрос. Неприменимо. Enumerable.ToLookup

В следующих примерах в этой статье используются общие источники данных для этой области:

public enum GradeLevel
{
    FirstYear = 1,
    SecondYear,
    ThirdYear,
    FourthYear
};

public class Student
{
    public required string FirstName { get; init; }
    public required string LastName { get; init; }
    public required int ID { get; init; }

    public required GradeLevel Year { get; init; }
    public required List<int> Scores { get; init; }

    public required int DepartmentID { get; init; }
}

public class Teacher
{
    public required string First { get; init; }
    public required string Last { get; init; }
    public required int ID { get; init; }
    public required string City { get; init; }
}
public class Department
{
    public required string Name { get; init; }
    public int ID { get; init; }

    public required int TeacherID { get; init; }
}

Каждый из них Student имеет уровень оценки, основной отдел и ряд показателей. У него Teacher также есть свойство, определяющее City кампус, где учитель проводит классы. У Department него есть имя и ссылка на Teacher того, кто выступает в качестве руководителя отдела.

Пример синтаксиса выражения запроса

В следующем примере кода явным образом типизированная переменная диапазона используется для приведения типа к подтипу перед обращением к элементу, доступному только в подтипе.

IEnumerable people = students;

var query = from Student student in students
            where student.Year == GradeLevel.ThirdYear
            select student;

foreach (Student student in query)
{
    Console.WriteLine(student.FirstName);
}

Эквивалентный запрос можно выразить с помощью синтаксиса метода, как показано в следующем примере:

IEnumerable people = students;

var query = people
    .Cast<Student>()
    .Where(student => student.Year == GradeLevel.ThirdYear);

foreach (Student student in query)
{
    Console.WriteLine(student.FirstName);
}

См. также