转换数据类型 (C#)

转换方法可更改输入对象的类型。

重要

这些示例使用 System.Collections.Generic.IEnumerable<T> 数据源。 基于 System.Linq.IQueryProvider 的数据源使用 System.Linq.IQueryable<T> 数据源和表达式树。 表达式树对允许的 C# 语法有限制。 此外,每个 IQueryProvider 数据源(如 EF Core)可能会施加更多限制。 查看数据源的文档。

LINQ 查询中的转换运算可用于各种应用程序。 以下是一些示例:

方法

下表列出了执行数据类型转换的标准查询运算符方法。

本表中名称以“As”开头的转换方法可更改源集合的静态类型,但不对其进行枚举。 名称以“To”开头的方法可枚举源集合,并将项放入相应的集合类型。

方法名 描述 C# 查询表达式语法 详细信息
AsEnumerable 返回类型化为 IEnumerable<T> 的输入。 不适用。 Enumerable.AsEnumerable
AsQueryable 将(泛型)IEnumerable 转换为(泛型)IQueryable 不适用。 Queryable.AsQueryable
Cast 将集合中的元素转换为指定类型。 使用显式类型化的范围变量。 例如:

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);
}

另请参阅