Udostępnij za pośrednictwem


Konwertowanie typów danych (C#)

Metody konwersji zmieniają typ obiektów wejściowych.

Ważne

Te przykłady używają System.Collections.Generic.IEnumerable<T> źródła danych. Źródła danych oparte na System.Linq.IQueryProvider System.Linq.IQueryable<T> źródłach danych i drzewach wyrażeń. Drzewa wyrażeń mają ograniczenia dotyczące dozwolonej składni języka C#. Ponadto każde IQueryProvider źródło danych, takie jak EF Core , może nakładać więcej ograniczeń. Zapoznaj się z dokumentacją źródła danych.

Operacje konwersji w zapytaniach LINQ są przydatne w różnych aplikacjach. Poniżej przedstawiono kilka przykładów:

Metody

W poniższej tabeli wymieniono standardowe metody operatorów zapytań, które wykonują konwersje typów danych.

Metody konwersji w tej tabeli, których nazwy zaczynają się od "Jako", zmieniają statyczny typ kolekcji źródłowej, ale nie wyliczają. Metody, których nazwy zaczynają się od "Do", wyliczają kolekcję źródłową i umieszczają elementy w odpowiednim typie kolekcji.

Nazwa metody opis Składnia wyrażeń zapytań języka C# Więcej informacji
AsEnumerable Zwraca dane wejściowe wpisane jako IEnumerable<T>. Nie dotyczy. Enumerable.AsEnumerable
AsQueryable Konwertuje (ogólny) IEnumerable na (ogólny) IQueryable. Nie dotyczy. Queryable.AsQueryable
Rzutowanie Rzutuje elementy kolekcji na określony typ. Użyj jawnie wpisanej zmiennej zakresu. Na przykład:

from string str in words
Enumerable.Cast

Queryable.Cast
OfType Filtruje wartości w zależności od ich możliwości rzutowania do określonego typu. Nie dotyczy. Enumerable.OfType

Queryable.OfType
ToArray Konwertuje kolekcję na tablicę. Ta metoda wymusza wykonywanie zapytań. Nie dotyczy. Enumerable.ToArray
ToDictionary Umieszcza elementy w oparciu Dictionary<TKey,TValue> o funkcję selektora kluczy. Ta metoda wymusza wykonywanie zapytań. Nie dotyczy. Enumerable.ToDictionary
Lista dolist Konwertuje kolekcję na .List<T> Ta metoda wymusza wykonywanie zapytań. Nie dotyczy. Enumerable.ToList
ToLookup Umieszcza elementy w słowniku Lookup<TKey,TElement> (jeden do wielu) na podstawie funkcji selektora kluczy. Ta metoda wymusza wykonywanie zapytań. Nie dotyczy. Enumerable.ToLookup

Uwaga

W poniższych przykładach w tym artykule użyto typowych źródeł danych dla tego obszaru.
Każdy z nich Student ma poziom klasy, dział podstawowy i serię wyników. Obiekt Teacher ma również właściwość identyfikującą City kampus, w którym nauczyciel posiada zajęcia. Element Department ma nazwę i odwołanie do osoby Teacher , która służy jako szef działu.
Przykładowy zestaw danych można znaleźć w repozytorium źródłowym.

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

Przykład składni wyrażenia zapytania

Poniższy przykład kodu używa jawnie typizowanej zmiennej zakresu do rzutowania typu do podtypu przed uzyskaniem dostępu do elementu członkowskiego, który jest dostępny tylko w podtypie.

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

Równoważne zapytanie można wyrazić przy użyciu składni metody, jak pokazano w poniższym przykładzie:

IEnumerable people = students;

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

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

Zobacz też