Conversione di tipi di dati (C#)
I metodi di conversione modificano il tipo degli oggetti di input.
Importante
In questi esempi viene usata un'origine dati System.Collections.Generic.IEnumerable<T>. Le origini dati basate su System.Linq.IQueryProvider usano origini dati System.Linq.IQueryable<T> e alberi delle espressioni. La sintassi consentita per gli alberi delle espressioni presenta limitazioni. Inoltre, ogni origine dati IQueryProvider
, ad esempio EF Core può imporre altre restrizioni. Consultare la documentazione relativa all'origine dati.
Le operazioni di conversione nelle query LINQ sono utili in varie applicazioni. Ecco alcuni esempi:
- Il metodo Enumerable.AsEnumerable può essere usato per nascondere l'implementazione personalizzata di un tipo di un operatore query standard.
- Il metodo Enumerable.OfType può essere usato per abilitare le raccolte senza parametri per l'esecuzione di query LINQ.
- I metodi Enumerable.ToArray, Enumerable.ToDictionary, Enumerable.ToList e Enumerable.ToLookup possono essere usati per forzare l'esecuzione di una query immediata invece che rinviarla fino a quando la query non viene enumerata.
Metodi
Nella tabella seguente sono elencati i metodi di operatore query standard che eseguono conversioni di tipi di dati.
I metodi di conversione in questa tabella i cui nomi iniziano con "As" modificano il tipo statico della raccolta di origine ma non lo enumerano. I metodi i cui nomi iniziano con "To" enumerano la raccolta di origine e inseriscono gli elementi nel tipo di raccolta corrispondente.
Nome metodo | Descrizione | Sintassi di espressione della query C# | Ulteriori informazioni |
---|---|---|---|
AsEnumerable | Restituisce l'input tipizzato come oggetto IEnumerable<T>. | Non applicabile. | Enumerable.AsEnumerable |
AsQueryable | Converte un oggetto IEnumerable (generico) in un oggetto IQueryable (generico). | Non applicabile. | Queryable.AsQueryable |
Cast | Esegue il cast degli elementi di una raccolta a un tipo specificato. | Usare una variabile di intervallo tipizzata in modo esplicito. Ad esempio:from string str in words |
Enumerable.Cast Queryable.Cast |
OfType | Filtra i valori, a seconda della loro capacità di eseguire il cast a un tipo specificato. | Non applicabile. | Enumerable.OfType Queryable.OfType |
ToArray | Converte una raccolta in una matrice. Questo metodo forza l'esecuzione di query. | Non applicabile. | Enumerable.ToArray |
ToDictionary | Inserisce gli elementi in un oggetto Dictionary<TKey,TValue> sulla base di una funzione del selettore di chiavi. Questo metodo forza l'esecuzione di query. | Non applicabile. | Enumerable.ToDictionary |
ToList | Converte una raccolta in un oggetto List<T>. Questo metodo forza l'esecuzione di query. | Non applicabile. | Enumerable.ToList |
ToLookup | Inserisce gli elementi in un oggetto Lookup<TKey,TElement>, un dizionario uno-a-molti, sulla base di una funzione del selettore di chiavi. Questo metodo forza l'esecuzione di query. | Non applicabile. | Enumerable.ToLookup |
Nota
Gli esempi seguenti in questo articolo usano le origini dati comuni per questa area.
Ogni Student
ha un livello di classe, un reparto primario e una serie di punteggi. Un Teacher
ha anche una proprietà City
che identifica il campus in cui l'insegnante tiene le lezioni. Un Department
ha un nome e un riferimento a un Teacher
che funge da responsabile del reparto.
È possibile trovare il set di dati di esempio nel repository di origine.
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; }
}
Esempio di sintassi delle espressioni di query
L'esempio di codice seguente usa una variabile di intervallo tipizzata in modo esplicito per eseguire il cast di un tipo a un sottotipo prima di accedere a un membro che è disponibile solo nel sottotipo.
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);
}
La query equivalente può essere espressa usando la sintassi del metodo come mostrato nell'esempio seguente:
IEnumerable people = students;
var query = people
.Cast<Student>()
.Where(student => student.Year == GradeLevel.ThirdYear);
foreach (Student student in query)
{
Console.WriteLine(student.FirstName);
}