Ricerca…
introduzione
LINQ (Language Integrated Query) è un'espressione che recupera i dati da un'origine dati. LINQ semplifica questa situazione offrendo un modello coerente per lavorare con i dati attraverso vari tipi di fonti e formati di dati. In una query LINQ, si lavora sempre con gli oggetti. Si utilizzano gli stessi schemi di codifica di base per interrogare e trasformare i dati in documenti XML, database SQL, set di dati ADO.NET, raccolte .NET e qualsiasi altro formato per il quale un provider è disponibile. LINQ può essere utilizzato in C # e VB.
Sintassi
- public static TSource Aggregate <TSource> (questa sorgente IEnumerable <TSource>, Func <TSource, TSource, TSource> func)
- TAccumulate Aggregate statico pubblico <TSource, TAccumulate> (questa sorgente IEnumerable <TSource>, seme TAccumulate, Func <TAccumulate, TSource, TAccumulate> func)
- statico pubblico TResult Aggregate <TSource, TAccumulate, TResult> (questa sorgente IEnumerable <TSource>, TAccumulate seed, Func <TAccumulate, TSource, TAccumulate>, Func <TAccumulate, TResult> resultSelector)
- public static Booleano Tutti <TSource> (questo predicato IEnumerable <Origine TSource, Func <TSource, Boolean>)
- public static Boolean Any <TSource> (questa origine IEnumerable <TSource>)
- public static Booleano Any <TSource> (questo predicato IEnumerable <Origine TS, Fun <TSource, Boolean>)
- public static IEnumerable <TSource> AsEnumerable <TSource> (questa sorgente IEnumerable <TSource>)
- Media decimale statica pubblica (questa origine IEnumerable <Decimal>)
- Double Average statico pubblico (questo IEnumerable <Double> origine)
- Double Average statico pubblico (questa sorgente IEnumerable <Int32>)
- Double Average statico pubblico (questa sorgente IEnumerable <Int64>)
- public static Nullable <Decimal> Average (questa fonte IEnumerable <Nullable <Decimal >>)
- public static Nullable <Double> Average (this IEnumerable <Nullable <Double >> source)
- public static Nullable <Double> Average (questa sorgente IEnumerable <Nullable <Int32 >>)
- public static Nullable <Double> Average (questa fonte IEnumerable <Nullable <Int64 >>)
- public static Nullable <Single> Average (this IEnumerable <Nullable <Single >> source)
- Media statica pubblica singola (questa origine IEnumerable <Single>)
- Media decimale statica media <TSource> (questo selettore IEnumerable <TSource>, Func <TSource, Decimal>)
- media statica Double Average <TSource> (questo sorgente IEnumerable <TSource>, Func <TSource, Double>)
- media statica Double Average <TSource> (questo componente IEnumerable <TSource>, Func <TSource, Int32>)
- media statica Double Average <TSource> (questo selettore IEnumerable <TSource>, Func <TSource, Int64>)
- public static Nullable <Decimal> Average <TSource> (questo IEnumerable <Origine TSource, Func <TSource, Nullable <Decimale >> Selettore)
- public static Nullable <Double> Average <TSource> (questa sorgente IEnumerable <TSource>, Func <TSource, Nullable <Double >>)
- public static Nullable <Double> Average <TSource> (questo IEnumerable <Origine TSource> Func <TSource, Nullable <Int32 >> selector)
- public static Nullable <Double> Average <TSource> (questo IEnumerable <Origine TSource> Func <TSource, Nullable <Int64 >> selector)
- public static Nullable <Single> Average <TSource> (questa sorgente IEnumerable <TSource>, Func <TSource, Nullable <Single >>)
- media singola statica pubblica <TSource> (questo selettore IEnumerable <Origine TSource, Func <TSource, Single>)
- public static IEnumerable <TResult> Cast <TResult> (questa sorgente IEnumerable)
- public static IEnumerable <TSource> Concat <TSource> (questo IEnumerable <TSource> first, IEnumerable <TSource> secondo)
- public static Boolean Contiene <TSource> (questa origine IEnumerable <TSource>, valore TSource)
- public static Boolean Contiene <TSource> (questa origine IEnumerable <TSource>, valore TSource, Comparatore IEqualityComparer <TSource>)
- Conteggio Int32 statico pubblico <TSource> (questa origine IEnumerable <TSource>)
- Conteggio Int32 statico pubblico <TSource> (questo predicato IEnumerable <Origine TSource, Func <TSource, Boolean>)
- public static IEnumerable <TSource> DefaultIfEmpty <TSource> (questa origine IEnumerable <TSource>)
- public static IEnumerable <TSource> DefaultIfEmpty <TSource> (questa sorgente IEnumerable <TSource>, TSource defaultValue)
- public static IEnumerable <TSource> Distinct <TSource> (questa origine IEnumerable <TSource>)
- public static IEnumerable <TSource> Distinct <TSource> (questa sorgente IEnumerable <TSource>, IEqualityComparer <TSource> comparer)
- public static TSource ElementAt <TSource> (questa sorgente IEnumerable <TSource>, indice Int32)
- pubblico statico TSource ElementAtOrDefault <TSource> (questa origine IEnumerable <TSource>, indice Int32)
- public static IEnumerable <TResult> Empty <TResult> ()
- public static IEnumerable <TSource> Eccetto <TSource> (questo IEnumerable <TSource> first, IEnumerable <TSource> secondo)
- public static IEnumerable <TSource> Tranne <TSource> (questo IEnumerable <TSource> first, IEnumerable <TSource> secondo, IEqualityComparer <TSource> comparer)
- public static TSource First <TSource> (questa origine IEnumerable <TSource>)
- public static TSource First <TSource> (questo predicato IEnumerable <TSource> source, Func <TSource, Boolean>)
- public static TSource FirstOrDefault <TSource> (questa origine IEnumerable <TSource>)
- public static TSource FirstOrDefault <TSource> (questo predicato IEnumerable <TSource> source, Func <TSource, Boolean>)
- public static IEnumerable <IGrouping <TKey, TSource >> GroupBy <TSource, TKey> (questa sorgente IEnumerable <TSource>, Func <TSource, TKey> keySelector)
- public static IEnumerable <IGrouping <TKey, TSource >> GroupBy <TSource, TKey> (questa sorgente IEnumerable <TSource>, Func <TSource, TKey> keySelector, IEqualityComparer <TKey> comparer)
- public static IEnumerable <IGrouping <TKey, TElement >> GroupBy <TSource, TKey, TElement> (questa sorgente IEnumerable <TSource>, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector)
- public static IEnumerable <IGrouping <TKey, TElement >> GroupBy <TSource, TKey, TElement> (questa sorgente IEnumerable <TSource>, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector, IEqualityComparer <TKey> comparer)
- public static IEnumerable <TResult> GroupBy <TSource, TKey, TResult> (questa sorgente IEnumerable <TSource>, Func <TSource, TKey> keySelector, Func <TKey, IEnumerable <TSource>, TResult> resultSelector)
- public static IEnumerable <TResult> GroupBy <TSource, TKey, TResult> (questa sorgente IEnumerable <TSource>, Func <TSource, TKey> keySelector, Func <TKey, IEnumerable <TSource>, TResult> resultSelector, IEqualityComparer <TKey> comparer)
- public static IEnumerable <TResult> GroupBy <TSource, TKey, TElement, TResult> (questa sorgente IEnumerable <TSource>, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector, Func <TKey, IEnumerable <TElement>, TResult > resultSelector)
- public static IEnumerable <TResult> GroupBy <TSource, TKey, TElement, TResult> (questa sorgente IEnumerable <TSource>, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector, Func <TKey, IEnumerable <TElement>, TResult > resultSelector, IEqualityComparer <TKey> comparer)
- public static IEnumerable <TResult> GroupJoin <TOuter, TInner, TKey, TResult> (questo IEnumerable <TOuter> esterno, IEnumerable <TInner> interno, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, IEnumerable <TInner>, TResult> resultSelector)
- public static IEnumerable <TResult> GroupJoin <TOuter, TInner, TKey, TResult> (questo IEnumerable <TOuter> esterno, IEnumerable <TInner> interno, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, IEnumerable <TInner>, TResult> resultSelector, IEqualityComparer <TKey> comparer)
- public static IEnumerable <TSource> Intersect <TSource> (questo IEnumerable <TSource> first, IEnumerable <TSource> second)
- public static IEnumerable <TSource> Intersect <TSource> (questo IEnumerable <TSource> first, IEnumerable <TSource> secondo, IEqualityComparer <TSource> comparer)
- public static IEnumerable <TResult> Join <TOuter, TInner, TKey, TResult> (questo IEnumerable <TOuter> esterno, IEnumerable <TInner> interno, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, TInner, TResult> resultSelector)
- public static IEnumerable <TResult> Join <TOuter, TInner, TKey, TResult> (questo IEnumerable <TOuter> esterno, IEnumerable <TInner> interno, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, TInner, TResult> resultSelector, IEqualityComparer <TKey> comparer)
- public static TSource Last <TSource> (questa fonte IEnumerable <TSource>)
- public static TSource Last <TSource> (questo predicato IEnumerable <TSource> source, Func <TSource, Boolean>)
- public static TSource LastOrDefault <TSource> (questa origine IEnumerable <TSource>)
- public static TSource LastOrDefault <TSource> (questo predicato IEnumerable <TSource>, Func <TSource, Boolean>)
- public static Int64 LongCount <TSource> (questa origine IEnumerable <TSource>)
- public static Int64 LongCount <TSource> (questo predicato IEnumerable <TSource> source, Func <TSource, Boolean>)
- Max decimale statico pubblico (questa origine IEnumerable <Decimal>)
- Double Max statico pubblico (questa sorgente <Double> di IEnumerable)
- Int32 Max statico pubblico (questa origine IEnumerable <Int32>)
- pubblico statico Int64 Max (questa sorgente IEnumerable <Int64>)
- public static Nullable <Decimal> Max (questa sorgente IEnumerable <Nullable <Decimal >>)
- public static Nullable <Double> Max (questa sorgente IEnumerable <Nullable <Double >>)
- statico pubblico Nullable <Int32> Max (questa sorgente IEnumerable <Nullable <Int32 >>)
- public static Nullable <Int64> Max (questa sorgente IEnumerable <Nullable <Int64 >>)
- public static Nullable <Single> Max (questa sorgente IEnumerable <Nullable <Single >>)
- Single Max pubblico statico (questa sorgente IEnumerable <Single>)
- public static TSource Max <TSource> (questa origine IEnumerable <TSource>)
- decimale statico pubblico massimo <TSource> (questo selettore IEnumerable <TSource>, Func <TSource, Decimal>)
- public static Double Max <TSource> (questo sorgente IEnumerable <TSource>, Func <TSource, Double>)
- public static Int32 Max <TSource> (questo selettore IEnumerable <TSource>, Func <TSource, Int32>)
- public static Int64 Max <TSource> (questo selettore IEnumerable <TSource>, Func <TSource, Int64>)
- public static Nullable <Decimal> Max <TSource> (questo sorgente IEnumerable <TSource>, Func <TSource, Nullable <Decimal >>)
- public static Nullable <Double> Max <TSource> (questa sorgente IEnumerable <TSource>, Func <TSource, Nullable <Double >>)
- public static Nullable <Int32> Max <TSource> (questo sorgente IEnumerable <TSource>, Func <TSource, Nullable <Int32 >>)
- public static Nullable <Int64> Max <TSource> (questo IEnumerable <Origine TSource> Func <TSource, Nullable <Int64 >> selector)
- public static Nullable <Single> Max <TSource> (questo sorgente IEnumerable <TSource>, Func <TSource, Nullable <Single >>)
- public static Single Max <TSource> (questo sorgente IEnumerable <TSource>, Func <TSource, Single>)
- pubblico statico TResult Max <TSource, TResult> (questo sorgente IEnumerable <TSource>, Func <TSource, TResult>)
- Minimo statico pubblico Minimo (questa origine IEnumerable <Decimal>)
- Double Min statico pubblico (questa origine IEnumerable <Double>)
- public static Int32 Min (questa sorgente IEnumerable <Int32>)
- pubblico statico Int64 Min (questa sorgente IEnumerable <Int64>)
- public static Nullable <Decimal> Min (questa fonte IEnumerable <Nullable <Decimal >>)
- public static Nullable <Double> Min (questa sorgente IEnumerable <Nullable <Double >>)
- public static Nullable <Int32> Min (questa sorgente IEnumerable <Nullable <Int32 >>)
- public static Nullable <Int64> Min (questa sorgente IEnumerable <Nullable <Int64 >>)
- statico pubblico Nullable <Singolo> Min (questo oggetto IEnumerable <Nullable <Single >>)
- Single Min statico pubblico (questa origine IEnumerable <Single>)
- public static TSource Min <TSource> (questa origine IEnumerable <TSource>)
- public static Decimal Min <TSource> (questo selettore IEnumerable <TSource>, Func <TSource, Decimal>)
- public static Double Min <TSource> (questo sorgente IEnumerable <TSource>, Func <TSource, Double>)
- public static Int32 Min <TSource> (questo sorgente IEnumerable <TSource>, Func <TSource, Int32>)
- public static Int64 Min <TSource> (questo selettore IEnumerable <TSource>, Func <TSource, Int64>)
- public static Nullable <Decimal> Min <TSource> (questo sorgente IEnumerable <Origine TS, Func <TSource, Nullable <Decimale >>)
- public static Nullable <Double> Min <TSource> (questa sorgente IEnumerable <TSource>, Func <TSource, Nullable <Double >>)
- public static Nullable <Int32> Min <TSource> (questo sorgente IEnumerable <Origine TS, Func <TSource, Nullable <Int32 >>)
- public static Nullable <Int64> Min <TSource> (questo IEnumerable <Origine TSource> Func <TSource, Nullable <Int64 >> selector)
- public static Nullable <Single> Min <TSource> (questo sorgente IEnumerable <TSource>, Func <TSource, Nullable <Single >>)
- public static Single Min <TSource> (questo sorgente IEnumerable <TSource>, Func <TSource, Single>)
- pubblico statico TResult Min <TSource, TResult> (questo sorgente IEnumerable <TSource>, Func <TSource, TResult>)
- public static IEnumerable <TResult> OfType <TResult> (questa sorgente IEnumerable)
- public static IOrderedEnumerable <TSource> OrderBy <TSource, TKey> (questa sorgente IEnumerable <TSource>, Func <TSource, TKey> keySelector)
- public static IOrderedEnumerable <TSource> OrderBy <TSource, TKey> (questa sorgente IEnumerable <TSource>, Func <TSource, TKey> keySelector, IComparer <TKey> comparer)
- public static IOrderedEnumerable <TSource> OrderByDescending <TSource, TKey> (questa sorgente IEnumerable <TSource>, Func <TSource, TKey> keySelector)
- public static IOrderedEnumerable <TSource> OrderByDescending <TSource, TKey> (questa sorgente IEnumerable <TSource>, Func <TSource, TKey> keySelector, IComparer <TKey> comparer)
- Intervallo pubblico IEnumerable <Int32> public (Int32 start, Int32 count)
- public static IEnumerable <TResult> Repeat <TResult> (elemento TResult, numero Int32)
- public static IEnumerable <TSource> Reverse <TSource> (questa sorgente IEnumerable <TSource>)
- public static IEnumerable <TResult> Seleziona <TSource, TResult> (questo sorgente IEnumerable <TSource>, Func <TSource, TResult>)
- public static IEnumerable <TResult> Seleziona <TSource, TResult> (questo sorgente IEnumerable <TSource>, Func <TSource, Int32, TResult>)
- public static IEnumerable <TResult> SelectMany <TSource, TResult> (questo sorgente IEnumerable <TSource>, Func <TSource, IEnumerable <TResult >>)
- public static IEnumerable <TResult> SelectMany <TSource, TResult> (questo sorgente IEnumerable <TSource>, Func <TSource, Int32, IEnumerable <TResult >>)
- public static IEnumerable <TResult> SelectMany <TSource, TCollection, TResult> (questa sorgente IEnumerable <TSource>, Func <TSource, IEnumerable <TCollection >> collectionSelector, Func <TSource, TCollection, TResult> resultSelector)
- public static IEnumerable <TResult> SelectMany <TSource, TCollection, TResult> (questa sorgente IEnumerable <TSource>, Func <TSource, Int32, IEnumerable <TCollection >> collectionSelector, Func <TSource, TCollection, TResult> resultSelector)
- public static Boolean SequenceEqual <TSource> (questo IEnumerable <TSource> first, IEnumerable <TSource> second)
- public static Boolean SequenceEqual <TSource> (questo IEnumerable <TSource> first, IEnumerable <TSource> secondo, IEqualityComparer <TSource> comparer)
- public static TSource Single <TSource> (questa sorgente IEnumerable <TSource>)
- public static TSource Single <TSource> (questo predicato IEnumerable <TSource> source, Func <TSource, Boolean>)
- public static TSource SingleOrDefault <TSource> (questa origine IEnumerable <TSource>)
- public static TSource SingleOrDefault <TSource> (questo predicato IEnumerable <TSource> source, Func <TSource, Boolean>)
- public static IEnumerable <TSource> Salta <TSource> (questa sorgente IEnumerable <TSource>, conteggio Int32)
- public static IEnumerable <TSource> SkipWhile <TSource> (questo predicato IEnumerable <TSource>, Func <TSource, Boolean>)
- statico pubblico IEnumerable <TSource> SkipWhile <TSource> (questo predicato IEnumerable <TSource>, Func <TSource, Int32, Boolean>)
- Somma decimale statica pubblica (questa origine IEnumerable <Decimal>)
- Double Sum statico pubblico (questa origine <Double> di IEnumerable)
- Somma Int32 statica pubblica (questa origine IEnumerable <Int32>)
- Somma Int64 statica pubblica (questa origine IEnumerable <Int64>)
- Sommario <decimale> Nullable statico pubblico (questa origine IEnumerable <Nullable <Decimal >>)
- public static Nullable <Double> Sum (this IEnumerable <Nullable <Double >> source)
- Somma statica pubblica Nullable <Int32> (questa origine IEnumerable <Nullable <Int32 >>)
- Somma statica pubblica Nullable <Int64> (questa origine IEnumerable <Nullable <Int64 >>)
- public static Nullable <Single> Sum (this IEnumerable <Nullable <Single >> source)
- Somma statica pubblica singola (questa origine IEnumerable <Single>)
- Somma decimale statica pubblica <TSource> (questo selettore IEnumerable <TSource>, Func <TSource, Decimal>)
- Double Sum statico pubblico <TSource> (questo sorgente IEnumerable <Origine TSource, Func <TSource, Double>)
- Somma Intica statica pubblica <TSource> (questo sorgente IEnumerable <Origine TSource, Func <TSource, Int32>)
- Somma Int64 statica pubblica <TSource> (questo selettore IEnumerable <TSource>, Func <TSource, Int64>)
- public static Nullable <Decimal> Sum <TSource> (questo IEnumerable <Origine TSource, Func <TSource, Nullable <Decimale >> Selettore)
- public static Nullable <Double> Sum <TSource> (questa sorgente IEnumerable <TSource>, Func <TSource, Nullable <Double >>)
- public static Nullable <Int32> Sum <TSource> (questo IEnumerable <Origine TSource> Func <TSource, Nullable <Int32 >> selector)
- public static Nullable <Int64> Sum <TSource> (questo componente IEnumerable <TSource>, Func <TSource, Nullable <Int64 >>)
- public static Nullable <Single> Sum <TSource> (questo sorgente IEnumerable <TSource>, Func <TSource, Nullable <Single >>)
- Somma statica pubblica singola <TSource> (questo selettore IEnumerable <TSource>, Func <TSource, Single>)
- public static IEnumerable <TSource> Take <TSource> (questa sorgente IEnumerable <TSource>, conteggio Int32)
- public static IEnumerable <TSource> TakeWhile <TSource> (questo predicato IEnumerable <TSource> source, Func <TSource, Boolean>)
- public static IEnumerable <TSource> TakeWhile <TSource> (questo predicato IEnumerable <TSource>, Func <TSource, Int32, Boolean>)
- public static IOrderedEnumerable <TSource> ThenBy <TSource, TKey> (questa sorgente IOrderedEnumerable <TSource>, Func <TSource, TKey> keySelector)
- public static IOrderedEnumerable <TSource> ThenBy <TSource, TKey> (questa sorgente IOrderedEnumerable <TSource>, Func <TSource, TKey> keySelector, IComparer <TKey> comparer)
- public static IOrderedEnumerable <TSource> ThenByDescending <TSource, TKey> (questa sorgente IOrderedEnumerable <TSource>, Func <TSource, TKey> keySelector)
- public static IOrderedEnumerable <TSource> ThenByDescending <TSource, TKey> (questa sorgente IOrderedEnumerable <TSource>, Func <TSource, TKey> keySelector, IComparer <TKey> comparer)
- public static TSource [] ToArray <TSource> (questa sorgente IEnumerable <TSource>)
- Dizionario statico pubblico <TKey, TSource> ToDictionary <TSource, TKey> (questa sorgente IEnumerable <TSource>, Func <TSource, TKey> keySelector)
- Dizionario statico pubblico <TKey, TSource> ToDictionary <TSource, TKey> (questa sorgente IEnumerable <TSource>, Func <TSource, TKey> keySelector, IEqualityComparer <TKey> comparer)
- Dizionario statico pubblico <TKey, TElement> ToDictionary <TSource, TKey, TElement> (questa sorgente IEnumerable <TSource>, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector)
- Dizionario statico pubblico <TKey, TElement> ToDictionary <TSource, TKey, TElement> (questa sorgente IEnumerable <TSource>, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector, IEqualityComparer <TKey> comparer)
- elenco statico pubblico <TSource> ToList <TSource> (questa origine IEnumerable <TSource>)
- public static ILookup <TKey, TSource> ToLookup <TSource, TKey> (questa sorgente IEnumerable <TSource>, Func <TSource, TKey> keySelector)
- public static ILookup <TKey, TSource> ToLookup <TSource, TKey> (questa sorgente IEnumerable <TSource>, Func <TSource, TKey> keySelector, IEqualityComparer <TKey> comparer)
- public static ILookup <TKey, TElement> ToLookup <TSource, TKey, TElement> (questa sorgente IEnumerable <TSource>, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector)
- public static ILookup <TKey, TElement> ToLookup <TSource, TKey, TElement> (questa sorgente IEnumerable <TSource>, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector, IEqualityComparer <TKey> comparer)
- public static IEnumerable <TSource> Union <TSource> (questo IEnumerable <TSource> first, IEnumerable <TSource> second)
- public static IEnumerable <TSource> Union <TSource> (questo IEnumerable <TSource> first, IEnumerable <TSource> secondo, IEqualityComparer <TSource> comparer)
- public static IEnumerable <TSource> Dove <TSource> (questo sorgente IEnumerable <TSource>, Func <TSource, Boolean>)
- public static IEnumerable <TSource> Dove <TSource> (questo sorgente IEnumerable <TSource>, Func <TSource, Int32, Boolean>)
- public static IEnumerable <TResult> Zip <TFirst, TSecond, TResult> (questo IEnumerable <TFirst> primo, IEnumerable <TSecond> secondo, Func <TFirst, TSecond, TResult> resultSelector)
Osservazioni
- Vedi anche LINQ .
I metodi integrati LINQ sono metodi di estensione per l'interfaccia IEnumerable<T>
che risiedono nella classe System.Linq.Enumerable
nell'assembly System.Core
. Sono disponibili in .NET Framework 3.5 e versioni successive.
LINQ consente la modifica, la trasformazione e la combinazione di vari IEnumerable
usando una sintassi di tipo query o funzionale.
Mentre i metodi LINQ standard possono funzionare su qualsiasi IEnumerable<T>
, compresi gli array semplici e List<T>
s, possono essere utilizzati anche su oggetti di database, in cui l'insieme di espressioni LINQ può essere trasformato in molti casi in SQL se il l'oggetto dati lo supporta. Vedi LINQ to SQL .
Per i metodi che confrontano gli oggetti (come Contains
ed Except
), IEquatable<T>.Equals
viene utilizzato se il tipo T della raccolta implementa tale interfaccia. In caso contrario, vengono utilizzati gli standard Equals
e GetHashCode
del tipo (eventualmente sovrascritti dalle implementazioni Object
predefinite). Esistono anche sovraccarichi per questi metodi che consentono di specificare un IEqualityComparer<T>
personalizzato IEqualityComparer<T>
.
Per i metodi ...OrDefault
, il default(T)
viene utilizzato per generare valori predefiniti.
Riferimento ufficiale: classe enumerabile
Valutazione pigra
Praticamente ogni query che restituisce un IEnumerable<T>
non viene valutata immediatamente; invece, la logica viene ritardata fino a quando la query non viene ripetuta. Una implicazione è che ogni volta che qualcuno esegue un'iterazione su un oggetto IEnumerable<T>
creato da una di queste query, ad esempio, .Where()
, viene ripetuta la logica di query completa. Se il predicato è di lunga durata, ciò può essere causa di problemi di prestazioni.
Una soluzione semplice (quando si conosce o può controllare la dimensione approssimativa della sequenza risultante) consiste nel bufferizzare completamente i risultati utilizzando .ToArray()
o .ToList()
. .ToDictionary()
o .ToLookup()
può svolgere lo stesso ruolo. Si può anche, ovviamente, iterare sull'intera sequenza e bufferizzare gli elementi secondo un'altra logica personalizzata.
ToArray()
o ToList()
?
Sia .ToArray()
che .ToList()
ciclo di tutti gli elementi di una sequenza I IEnumerable<T>
.ToList()
IEnumerable<T>
e salvano i risultati in una raccolta archiviata in memoria. Utilizzare le seguenti linee guida per determinare quale scegliere:
- Alcune API potrebbero richiedere un
T[]
o unList<T>
. -
.ToList()
genere gira più velocemente e genera meno garbage di.ToArray()
, perché quest'ultimo deve copiare tutti gli elementi in una nuova raccolta di dimensioni fisse ancora una volta rispetto al primo, in quasi tutti i casi. - Gli elementi possono essere aggiunti o rimossi dall'elenco
List<T>
restituito da.ToList()
, mentre ilT[]
restituito da.ToArray()
rimane una dimensione fissa per tutta la sua durata. In altre parole,List<T>
è mutabile eT[]
è immutabile. - Il
T[]
restituito da.ToArray()
utilizza meno memoria rispetto aList<T>
restituito da.ToList()
, quindi se il risultato verrà memorizzato per un lungo periodo, preferisci.ToArray()
. CallingList<T>.TrimExcess()
renderebbe la differenza di memoria strettamente accademica, al costo di eliminare il vantaggio relativo della velocità di.ToList()
.
Seleziona (mappa)
var persons = new[]
{
new {Id = 1, Name = "Foo"},
new {Id = 2, Name = "Bar"},
new {Id = 3, Name = "Fizz"},
new {Id = 4, Name = "Buzz"}
};
var names = persons.Select(p => p.Name);
Console.WriteLine(string.Join(",", names.ToArray()));
//Foo,Bar,Fizz,Buzz
Questo tipo di funzione viene solitamente chiamato map
nei linguaggi di programmazione funzionale.
Dove (filtro)
Questo metodo restituisce un oggetto IEnumerable con tutti gli elementi che soddisfano l'espressione lambda
Esempio
var personNames = new[]
{
"Foo", "Bar", "Fizz", "Buzz"
};
var namesStartingWithF = personNames.Where(p => p.StartsWith("F"));
Console.WriteLine(string.Join(",", namesStartingWithF));
Produzione:
Foo, Fizz
Ordinato da
var persons = new[]
{
new {Id = 1, Name = "Foo"},
new {Id = 2, Name = "Bar"},
new {Id = 3, Name = "Fizz"},
new {Id = 4, Name = "Buzz"}
};
var personsSortedByName = persons.OrderBy(p => p.Name);
Console.WriteLine(string.Join(",", personsSortedByName.Select(p => p.Id).ToArray()));
//2,4,3,1
OrderByDescending
var persons = new[]
{
new {Id = 1, Name = "Foo"},
new {Id = 2, Name = "Bar"},
new {Id = 3, Name = "Fizz"},
new {Id = 4, Name = "Buzz"}
};
var personsSortedByNameDescending = persons.OrderByDescending(p => p.Name);
Console.WriteLine(string.Join(",", personsSortedByNameDescending.Select(p => p.Id).ToArray()));
//1,3,4,2
contiene
var numbers = new[] {1,2,3,4,5};
Console.WriteLine(numbers.Contains(3)); //True
Console.WriteLine(numbers.Contains(34)); //False
tranne
var numbers = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var evenNumbersBetweenSixAndFourteen = new[] { 6, 8, 10, 12 };
var result = numbers.Except(evenNumbersBetweenSixAndFourteen);
Console.WriteLine(string.Join(",", result));
//1, 2, 3, 4, 5, 7, 9
intersecare
var numbers1to10 = new[] {1,2,3,4,5,6,7,8,9,10};
var numbers5to15 = new[] {5,6,7,8,9,10,11,12,13,14,15};
var numbers5to10 = numbers1to10.Intersect(numbers5to15);
Console.WriteLine(string.Join(",", numbers5to10));
//5,6,7,8,9,10
concat
var numbers1to5 = new[] {1, 2, 3, 4, 5};
var numbers4to8 = new[] {4, 5, 6, 7, 8};
var numbers1to8 = numbers1to5.Concat(numbers4to8);
Console.WriteLine(string.Join(",", numbers1to8));
//1,2,3,4,5,4,5,6,7,8
Si noti che i duplicati vengono mantenuti nel risultato. Se questo non è desiderabile, usa invece Union
.
Primo (trova)
var numbers = new[] {1,2,3,4,5};
var firstNumber = numbers.First();
Console.WriteLine(firstNumber); //1
var firstEvenNumber = numbers.First(n => (n & 1) == 0);
Console.WriteLine(firstEvenNumber); //2
Il seguente lancio di InvalidOperationException
con il messaggio "Sequenza non contiene elementi corrispondenti":
var firstNegativeNumber = numbers.First(n => n < 0);
singolo
var oneNumber = new[] {5};
var theOnlyNumber = oneNumber.Single();
Console.WriteLine(theOnlyNumber); //5
var numbers = new[] {1,2,3,4,5};
var theOnlyNumberSmallerThanTwo = numbers.Single(n => n < 2);
Console.WriteLine(theOnlyNumberSmallerThanTwo); //1
Di seguito viene InvalidOperationException
poiché è presente più di un elemento nella sequenza:
var theOnlyNumberInNumbers = numbers.Single();
var theOnlyNegativeNumber = numbers.Single(n => n < 0);
Scorso
var numbers = new[] {1,2,3,4,5};
var lastNumber = numbers.Last();
Console.WriteLine(lastNumber); //5
var lastEvenNumber = numbers.Last(n => (n & 1) == 0);
Console.WriteLine(lastEvenNumber); //4
Il seguente lancio di InvalidOperationException
:
var lastNegativeNumber = numbers.Last(n => n < 0);
LastOrDefault
var numbers = new[] {1,2,3,4,5};
var lastNumber = numbers.LastOrDefault();
Console.WriteLine(lastNumber); //5
var lastEvenNumber = numbers.LastOrDefault(n => (n & 1) == 0);
Console.WriteLine(lastEvenNumber); //4
var lastNegativeNumber = numbers.LastOrDefault(n => n < 0);
Console.WriteLine(lastNegativeNumber); //0
var words = new[] { "one", "two", "three", "four", "five" };
var lastWord = words.LastOrDefault();
Console.WriteLine(lastWord); // five
var lastLongWord = words.LastOrDefault(w => w.Length > 4);
Console.WriteLine(lastLongWord); // three
var lastMissingWord = words.LastOrDefault(w => w.Length > 5);
Console.WriteLine(lastMissingWord); // null
SingleOrDefault
var oneNumber = new[] {5};
var theOnlyNumber = oneNumber.SingleOrDefault();
Console.WriteLine(theOnlyNumber); //5
var numbers = new[] {1,2,3,4,5};
var theOnlyNumberSmallerThanTwo = numbers.SingleOrDefault(n => n < 2);
Console.WriteLine(theOnlyNumberSmallerThanTwo); //1
var theOnlyNegativeNumber = numbers.SingleOrDefault(n => n < 0);
Console.WriteLine(theOnlyNegativeNumber); //0
Il seguente lancio di InvalidOperationException
:
var theOnlyNumberInNumbers = numbers.SingleOrDefault();
FirstOrDefault
var numbers = new[] {1,2,3,4,5};
var firstNumber = numbers.FirstOrDefault();
Console.WriteLine(firstNumber); //1
var firstEvenNumber = numbers.FirstOrDefault(n => (n & 1) == 0);
Console.WriteLine(firstEvenNumber); //2
var firstNegativeNumber = numbers.FirstOrDefault(n => n < 0);
Console.WriteLine(firstNegativeNumber); //0
var words = new[] { "one", "two", "three", "four", "five" };
var firstWord = words.FirstOrDefault();
Console.WriteLine(firstWord); // one
var firstLongWord = words.FirstOrDefault(w => w.Length > 3);
Console.WriteLine(firstLongWord); // three
var firstMissingWord = words.FirstOrDefault(w => w.Length > 5);
Console.WriteLine(firstMissingWord); // null
Qualunque
Restituisce true
se la raccolta ha elementi che soddisfano la condizione nell'espressione lambda:
var numbers = new[] {1,2,3,4,5};
var isNotEmpty = numbers.Any();
Console.WriteLine(isNotEmpty); //True
var anyNumberIsOne = numbers.Any(n => n == 1);
Console.WriteLine(anyNumberIsOne); //True
var anyNumberIsSix = numbers.Any(n => n == 6);
Console.WriteLine(anyNumberIsSix); //False
var anyNumberIsOdd = numbers.Any(n => (n & 1) == 1);
Console.WriteLine(anyNumberIsOdd); //True
var anyNumberIsNegative = numbers.Any(n => n < 0);
Console.WriteLine(anyNumberIsNegative); //False
Tutti
var numbers = new[] {1,2,3,4,5};
var allNumbersAreOdd = numbers.All(n => (n & 1) == 1);
Console.WriteLine(allNumbersAreOdd); //False
var allNumbersArePositive = numbers.All(n => n > 0);
Console.WriteLine(allNumbersArePositive); //True
Si noti che All
funzioni del metodo controllano che il primo elemento venga valutato come false
base al predicato. Pertanto, il metodo restituirà true
per qualsiasi predicato nel caso in cui il set sia vuoto:
var numbers = new int[0];
var allNumbersArePositive = numbers.All(n => n > 0);
Console.WriteLine(allNumbersArePositive); //True
SelectMany (mappa piana)
Enumerable.Select
restituisce un elemento di output per ogni elemento di input. Mentre Enumerable.SelectMany
produce un numero variabile di elementi di output per ciascun elemento di input. Ciò significa che la sequenza di output può contenere più o meno elementi rispetto alla sequenza di input.
Lambda expressions
passate a Enumerable.Select
devono restituire un singolo elemento. Le espressioni lambda passate a Enumerable.SelectMany
devono produrre una sequenza figlio. Questa sequenza figlio può contenere un numero variabile di elementi per ciascun elemento nella sequenza di input.
Esempio
class Invoice
{
public int Id { get; set; }
}
class Customer
{
public Invoice[] Invoices {get;set;}
}
var customers = new[] {
new Customer {
Invoices = new[] {
new Invoice {Id=1},
new Invoice {Id=2},
}
},
new Customer {
Invoices = new[] {
new Invoice {Id=3},
new Invoice {Id=4},
}
},
new Customer {
Invoices = new[] {
new Invoice {Id=5},
new Invoice {Id=6},
}
}
};
var allInvoicesFromAllCustomers = customers.SelectMany(c => c.Invoices);
Console.WriteLine(
string.Join(",", allInvoicesFromAllCustomers.Select(i => i.Id).ToArray()));
Produzione:
1,2,3,4,5,6
Enumerable.SelectMany
può essere ottenuta anche con una query sintassi basata utilizzando due consecutivi from
clausole:
var allInvoicesFromAllCustomers
= from customer in customers
from invoice in customer.Invoices
select invoice;
Somma
var numbers = new[] {1,2,3,4};
var sumOfAllNumbers = numbers.Sum();
Console.WriteLine(sumOfAllNumbers); //10
var cities = new[] {
new {Population = 1000},
new {Population = 2500},
new {Population = 4000}
};
var totalPopulation = cities.Sum(c => c.Population);
Console.WriteLine(totalPopulation); //7500
Salta
Salta enumera i primi N elementi senza restituirli. Una volta raggiunto il numero di articolo N + 1, Skip inizia a restituire ogni elemento elencato:
var numbers = new[] {1,2,3,4,5};
var allNumbersExceptFirstTwo = numbers.Skip(2);
Console.WriteLine(string.Join(",", allNumbersExceptFirstTwo.ToArray()));
//3,4,5
Prendere
Questo metodo prende i primi n
elementi da una enumerabile.
var numbers = new[] {1,2,3,4,5};
var threeFirstNumbers = numbers.Take(3);
Console.WriteLine(string.Join(",", threeFirstNumbers.ToArray()));
//1,2,3
SequenceEqual
var numbers = new[] {1,2,3,4,5};
var sameNumbers = new[] {1,2,3,4,5};
var sameNumbersInDifferentOrder = new[] {5,1,4,2,3};
var equalIfSameOrder = numbers.SequenceEqual(sameNumbers);
Console.WriteLine(equalIfSameOrder); //True
var equalIfDifferentOrder = numbers.SequenceEqual(sameNumbersInDifferentOrder);
Console.WriteLine(equalIfDifferentOrder); //False
Inverso
var numbers = new[] {1,2,3,4,5};
var reversed = numbers.Reverse();
Console.WriteLine(string.Join(",", reversed.ToArray()));
//5,4,3,2,1
OfType
var mixed = new object[] {1,"Foo",2,"Bar",3,"Fizz",4,"Buzz"};
var numbers = mixed.OfType<int>();
Console.WriteLine(string.Join(",", numbers.ToArray()));
//1,2,3,4
Max
var numbers = new[] {1,2,3,4};
var maxNumber = numbers.Max();
Console.WriteLine(maxNumber); //4
var cities = new[] {
new {Population = 1000},
new {Population = 2500},
new {Population = 4000}
};
var maxPopulation = cities.Max(c => c.Population);
Console.WriteLine(maxPopulation); //4000
min
var numbers = new[] {1,2,3,4};
var minNumber = numbers.Min();
Console.WriteLine(minNumber); //1
var cities = new[] {
new {Population = 1000},
new {Population = 2500},
new {Population = 4000}
};
var minPopulation = cities.Min(c => c.Population);
Console.WriteLine(minPopulation); //1000
Media
var numbers = new[] {1,2,3,4};
var averageNumber = numbers.Average();
Console.WriteLine(averageNumber);
// 2,5
Questo metodo calcola la media di enumerable di numeri.
var cities = new[] {
new {Population = 1000},
new {Population = 2000},
new {Population = 4000}
};
var averagePopulation = cities.Average(c => c.Population);
Console.WriteLine(averagePopulation);
// 2333,33
Questo metodo calcola la media di enumerable utilizzando la funzione delegata.
Cerniera lampo
var tens = new[] {10,20,30,40,50};
var units = new[] {1,2,3,4,5};
var sums = tens.Zip(units, (first, second) => first + second);
Console.WriteLine(string.Join(",", sums));
//11,22,33,44,55
distinto
var numbers = new[] {1, 1, 2, 2, 3, 3, 4, 4, 5, 5};
var distinctNumbers = numbers.Distinct();
Console.WriteLine(string.Join(",", distinctNumbers));
//1,2,3,4,5
Raggruppa per
var persons = new[] {
new { Name="Fizz", Job="Developer"},
new { Name="Buzz", Job="Developer"},
new { Name="Foo", Job="Astronaut"},
new { Name="Bar", Job="Astronaut"},
};
var groupedByJob = persons.GroupBy(p => p.Job);
foreach(var theGroup in groupedByJob)
{
Console.WriteLine(
"{0} are {1}s",
string.Join(",", theGroup.Select(g => g.Name).ToArray()),
theGroup.Key);
}
//Fizz,Buzz are Developers
//Foo,Bar are Astronauts
Raggruppa le fatture per paese, generando un nuovo oggetto con il numero di record, totale pagato e retribuzione media
var a = db.Invoices.GroupBy(i => i.Country)
.Select(g => new { Country = g.Key,
Count = g.Count(),
Total = g.Sum(i => i.Paid),
Average = g.Average(i => i.Paid) });
Se vogliamo solo i totali, nessun gruppo
var a = db.Invoices.GroupBy(i => 1)
.Select(g => new { Count = g.Count(),
Total = g.Sum(i => i.Paid),
Average = g.Average(i => i.Paid) });
Se abbiamo bisogno di più conteggi
var a = db.Invoices.GroupBy(g => 1)
.Select(g => new { High = g.Count(i => i.Paid >= 1000),
Low = g.Count(i => i.Paid < 1000),
Sum = g.Sum(i => i.Paid) });
ToDictionary
Restituisce un nuovo dizionario dalla sorgente IEnumerable
utilizzando la funzione keySelector fornita per determinare le chiavi. Lancia una ArgumentException
se keySelector non è iniettivo (restituisce un valore univoco per ogni membro della collezione di origine.) Esistono sovraccarichi che consentono di specificare il valore da memorizzare e la chiave.
var persons = new[] {
new { Name="Fizz", Id=1},
new { Name="Buzz", Id=2},
new { Name="Foo", Id=3},
new { Name="Bar", Id=4},
};
Specificando solo una funzione selettore di chiave creerai un Dictionary<TKey,TVal>
con TKey
il tipo di ritorno del selettore di chiave, TVal
il tipo di oggetto originale e l'oggetto originale come valore memorizzato.
var personsById = persons.ToDictionary(p => p.Id);
// personsById is a Dictionary<int,object>
Console.WriteLine(personsById[1].Name); //Fizz
Console.WriteLine(personsById[2].Name); //Buzz
Specificando anche una funzione selettore valore creerai un Dictionary<TKey,TVal>
con TKey
ancora il tipo di ritorno del selettore di chiave, ma TVal
ora il tipo restituito della funzione selettore valore e il valore restituito come valore memorizzato.
var namesById = persons.ToDictionary(p => p.Id, p => p.Name);
//namesById is a Dictionary<int,string>
Console.WriteLine(namesById[3]); //Foo
Console.WriteLine(namesById[4]); //Bar
Come detto sopra, le chiavi restituite dal selettore di chiave devono essere uniche. Quanto segue genererà un'eccezione.
var persons = new[] {
new { Name="Fizz", Id=1},
new { Name="Buzz", Id=2},
new { Name="Foo", Id=3},
new { Name="Bar", Id=4},
new { Name="Oops", Id=4}
};
var willThrowException = persons.ToDictionary(p => p.Id)
Se non è possibile fornire una chiave univoca per la raccolta di origine, prendere in considerazione l'utilizzo di ToLookup. In superficie, ToLookup si comporta in modo simile a ToDictionary, tuttavia, nella ricerca risultante ogni chiave è abbinata a un insieme di valori con chiavi corrispondenti.
Unione
var numbers1to5 = new[] {1,2,3,4,5};
var numbers4to8 = new[] {4,5,6,7,8};
var numbers1to8 = numbers1to5.Union(numbers4to8);
Console.WriteLine(string.Join(",", numbers1to8));
//1,2,3,4,5,6,7,8
Si noti che i duplicati vengono rimossi dal risultato. Se questo non è auspicabile, utilizzare invece Concat
.
ToArray
var numbers = new[] {1,2,3,4,5,6,7,8,9,10};
var someNumbers = numbers.Where(n => n < 6);
Console.WriteLine(someNumbers.GetType().Name);
//WhereArrayIterator`1
var someNumbersArray = someNumbers.ToArray();
Console.WriteLine(someNumbersArray.GetType().Name);
//Int32[]
Elencare
var numbers = new[] {1,2,3,4,5,6,7,8,9,10};
var someNumbers = numbers.Where(n => n < 6);
Console.WriteLine(someNumbers.GetType().Name);
//WhereArrayIterator`1
var someNumbersList = someNumbers.ToList();
Console.WriteLine(
someNumbersList.GetType().Name + " - " +
someNumbersList.GetType().GetGenericArguments()[0].Name);
//List`1 - Int32
Contare
IEnumerable<int> numbers = new[] {1,2,3,4,5,6,7,8,9,10};
var numbersCount = numbers.Count();
Console.WriteLine(numbersCount); //10
var evenNumbersCount = numbers.Count(n => (n & 1) == 0);
Console.WriteLine(evenNumbersCount); //5
ElementAt
var names = new[] {"Foo","Bar","Fizz","Buzz"};
var thirdName = names.ElementAt(2);
Console.WriteLine(thirdName); //Fizz
//The following throws ArgumentOutOfRangeException
var minusOnethName = names.ElementAt(-1);
var fifthName = names.ElementAt(4);
ElementAtOrDefault
var names = new[] {"Foo","Bar","Fizz","Buzz"};
var thirdName = names.ElementAtOrDefault(2);
Console.WriteLine(thirdName); //Fizz
var minusOnethName = names.ElementAtOrDefault(-1);
Console.WriteLine(minusOnethName); //null
var fifthName = names.ElementAtOrDefault(4);
Console.WriteLine(fifthName); //null
SkipWhile
var numbers = new[] {2,4,6,8,1,3,5,7};
var oddNumbers = numbers.SkipWhile(n => (n & 1) == 0);
Console.WriteLine(string.Join(",", oddNumbers.ToArray()));
//1,3,5,7
TakeWhile
var numbers = new[] {2,4,6,1,3,5,7,8};
var evenNumbers = numbers.TakeWhile(n => (n & 1) == 0);
Console.WriteLine(string.Join(",", evenNumbers.ToArray()));
//2,4,6
DefaultIfEmpty
var numbers = new[] {2,4,6,8,1,3,5,7};
var numbersOrDefault = numbers.DefaultIfEmpty();
Console.WriteLine(numbers.SequenceEqual(numbersOrDefault)); //True
var noNumbers = new int[0];
var noNumbersOrDefault = noNumbers.DefaultIfEmpty();
Console.WriteLine(noNumbersOrDefault.Count()); //1
Console.WriteLine(noNumbersOrDefault.Single()); //0
var noNumbersOrExplicitDefault = noNumbers.DefaultIfEmpty(34);
Console.WriteLine(noNumbersOrExplicitDefault.Count()); //1
Console.WriteLine(noNumbersOrExplicitDefault.Single()); //34
Aggregato (piega)
Generazione di un nuovo oggetto in ogni fase:
var elements = new[] {1,2,3,4,5};
var commaSeparatedElements = elements.Aggregate(
seed: "",
func: (aggregate, element) => $"{aggregate}{element},");
Console.WriteLine(commaSeparatedElements); //1,2,3,4,5,
Utilizzando lo stesso oggetto in tutti i passaggi:
var commaSeparatedElements2 = elements.Aggregate(
seed: new StringBuilder(),
func: (seed, element) => seed.Append($"{element},"));
Console.WriteLine(commaSeparatedElements2.ToString()); //1,2,3,4,5,
Utilizzando un selettore di risultati:
var commaSeparatedElements3 = elements.Aggregate(
seed: new StringBuilder(),
func: (seed, element) => seed.Append($"{element},"),
resultSelector: (seed) => seed.ToString());
Console.WriteLine(commaSeparatedElements3); //1,2,3,4,5,
Se un seme viene omesso, il primo elemento diventa il seme:
var seedAndElements = elements.Select(n=>n.ToString());
var commaSeparatedElements4 = seedAndElements.Aggregate(
func: (aggregate, element) => $"{aggregate}{element},");
Console.WriteLine(commaSeparatedElements4); //12,3,4,5,
ToLookup
var persons = new[] {
new { Name="Fizz", Job="Developer"},
new { Name="Buzz", Job="Developer"},
new { Name="Foo", Job="Astronaut"},
new { Name="Bar", Job="Astronaut"},
};
var groupedByJob = persons.ToLookup(p => p.Job);
foreach(var theGroup in groupedByJob)
{
Console.WriteLine(
"{0} are {1}s",
string.Join(",", theGroup.Select(g => g.Name).ToArray()),
theGroup.Key);
}
//Fizz,Buzz are Developers
//Foo,Bar are Astronauts
Aderire
class Developer
{
public int Id { get; set; }
public string Name { get; set; }
}
class Project
{
public int DeveloperId { get; set; }
public string Name { get; set; }
}
var developers = new[] {
new Developer {
Id = 1,
Name = "Foobuzz"
},
new Developer {
Id = 2,
Name = "Barfizz"
}
};
var projects = new[] {
new Project {
DeveloperId = 1,
Name = "Hello World 3D"
},
new Project {
DeveloperId = 1,
Name = "Super Fizzbuzz Maker"
},
new Project {
DeveloperId = 2,
Name = "Citizen Kane - The action game"
},
new Project {
DeveloperId = 2,
Name = "Pro Pong 2016"
}
};
var denormalized = developers.Join(
inner: projects,
outerKeySelector: dev => dev.Id,
innerKeySelector: proj => proj.DeveloperId,
resultSelector:
(dev, proj) => new {
ProjectName = proj.Name,
DeveloperName = dev.Name});
foreach(var item in denormalized)
{
Console.WriteLine("{0} by {1}", item.ProjectName, item.DeveloperName);
}
//Hello World 3D by Foobuzz
//Super Fizzbuzz Maker by Foobuzz
//Citizen Kane - The action game by Barfizz
//Pro Pong 2016 by Barfizz
GroupJoin
class Developer
{
public int Id { get; set; }
public string Name { get; set; }
}
class Project
{
public int DeveloperId { get; set; }
public string Name { get; set; }
}
var developers = new[] {
new Developer {
Id = 1,
Name = "Foobuzz"
},
new Developer {
Id = 2,
Name = "Barfizz"
}
};
var projects = new[] {
new Project {
DeveloperId = 1,
Name = "Hello World 3D"
},
new Project {
DeveloperId = 1,
Name = "Super Fizzbuzz Maker"
},
new Project {
DeveloperId = 2,
Name = "Citizen Kane - The action game"
},
new Project {
DeveloperId = 2,
Name = "Pro Pong 2016"
}
};
var grouped = developers.GroupJoin(
inner: projects,
outerKeySelector: dev => dev.Id,
innerKeySelector: proj => proj.DeveloperId,
resultSelector:
(dev, projs) => new {
DeveloperName = dev.Name,
ProjectNames = projs.Select(p => p.Name).ToArray()});
foreach(var item in grouped)
{
Console.WriteLine(
"{0}'s projects: {1}",
item.DeveloperName,
string.Join(", ", item.ProjectNames));
}
//Foobuzz's projects: Hello World 3D, Super Fizzbuzz Maker
//Barfizz's projects: Citizen Kane - The action game, Pro Pong 2016
lanciare
Cast
è diverso dagli altri metodi di Enumerable
in quanto è un metodo di estensione per IEnumerable
, non per IEnumerable<T>
. Quindi può essere usato per convertire istanze del precedente in istanze del successivo.
Questo non viene compilato poiché ArrayList
non implementa IEnumerable<T>
:
var numbers = new ArrayList() {1,2,3,4,5};
Console.WriteLine(numbers.First());
Funziona come previsto:
var numbers = new ArrayList() {1,2,3,4,5};
Console.WriteLine(numbers.Cast<int>().First()); //1
Cast
non esegue cast di conversione. Il seguente compila, ma lancia InvalidCastException
in fase di runtime:
var numbers = new int[] {1,2,3,4,5};
decimal[] numbersAsDecimal = numbers.Cast<decimal>().ToArray();
Il modo corretto per eseguire un cast di conversione in una raccolta è il seguente:
var numbers= new int[] {1,2,3,4,5};
decimal[] numbersAsDecimal = numbers.Select(n => (decimal)n).ToArray();
Vuoto
Per creare un IEnumerable vuoto di int:
IEnumerable<int> emptyList = Enumerable.Empty<int>();
Questo IEnumerable vuoto viene memorizzato nella cache per ogni tipo T, in modo che:
Enumerable.Empty<decimal>() == Enumerable.Empty<decimal>(); // This is True
Enumerable.Empty<int>() == Enumerable.Empty<decimal>(); // This is False
ThenBy
ThenBy
può essere utilizzato solo dopo una clausola OrderBy
che consente di ordinare utilizzando più criteri
var persons = new[]
{
new {Id = 1, Name = "Foo", Order = 1},
new {Id = 1, Name = "FooTwo", Order = 2},
new {Id = 2, Name = "Bar", Order = 2},
new {Id = 2, Name = "BarTwo", Order = 1},
new {Id = 3, Name = "Fizz", Order = 2},
new {Id = 3, Name = "FizzTwo", Order = 1},
};
var personsSortedByName = persons.OrderBy(p => p.Id).ThenBy(p => p.Order);
Console.WriteLine(string.Join(",", personsSortedByName.Select(p => p.Name)));
//This will display :
//Foo,FooTwo,BarTwo,Bar,FizzTwo,Fizz
Gamma
I due parametri di Range
sono il primo numero e il numero di elementi da produrre (non l'ultimo numero).
// prints 1,2,3,4,5,6,7,8,9,10
Console.WriteLine(string.Join(",", Enumerable.Range(1, 10)));
// prints 10,11,12,13,14
Console.WriteLine(string.Join(",", Enumerable.Range(10, 5)));
Left Outer Join
class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
class Pet
{
public string Name { get; set; }
public Person Owner { get; set; }
}
public static void Main(string[] args)
{
var magnus = new Person { FirstName = "Magnus", LastName = "Hedlund" };
var terry = new Person { FirstName = "Terry", LastName = "Adams" };
var barley = new Pet { Name = "Barley", Owner = terry };
var people = new[] { magnus, terry };
var pets = new[] { barley };
var query =
from person in people
join pet in pets on person equals pet.Owner into gj
from subpet in gj.DefaultIfEmpty()
select new
{
person.FirstName,
PetName = subpet?.Name ?? "-" // Use - if he has no pet
};
foreach (var p in query)
Console.WriteLine($"{p.FirstName}: {p.PetName}");
}
Ripetere
Enumerable.Repeat
genera una sequenza di un valore ripetuto. In questo esempio genera "Ciao" 4 volte.
var repeats = Enumerable.Repeat("Hello", 4);
foreach (var item in repeats)
{
Console.WriteLine(item);
}
/* output:
Hello
Hello
Hello
Hello
*/