Преобразование типов данных (C#)
Методы преобразования изменяют тип входных объектов.
Внимание
В этих примерах используется System.Collections.Generic.IEnumerable<T> источник данных. Источники данных, основанные на System.Linq.IQueryProvider использовании System.Linq.IQueryable<T> источников данных и деревьев выражений. Деревья выражений имеют ограничения на допустимый синтаксис C#. Кроме того, каждый IQueryProvider
источник данных, например EF Core , может наложить больше ограничений. Ознакомьтесь с документацией по источнику данных.
Операции преобразования в запросах 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);
}