Zoeken…
Invoering
LINQ (Language Integrated Query) is een uitdrukking die gegevens ophaalt uit een gegevensbron. LINQ vereenvoudigt deze situatie door een consistent model aan te bieden voor het werken met gegevens in verschillende soorten gegevensbronnen en -indelingen. In een LINQ-query werkt u altijd met objecten. U gebruikt dezelfde basiscoderingspatronen om gegevens op te vragen en te transformeren in XML-documenten, SQL-databases, ADO.NET-gegevenssets, .NET-collecties en elk ander formaat waarvoor een provider beschikbaar is. LINQ kan worden gebruikt in C # en VB.
Syntaxis
- public static TSource Aggregate <TSource> (deze IEnumerable <TSource> bron, Func <TSource, TSource, TSource> func)
- public static TAccumulate Aggregate <TSource, TAccumulate> (deze IEnumerable <TSource> source, TAccumulate seed, Func <TAccumulate, TSource, TAccumulate> func)
- public static TResult Aggregate <TSource, TAccumulate, TResult> (deze IEnumerable <TSource> source, TAccumulate seed, Func <TAccumulate, TSource, TAccumulate> func, Func <TAccumulate, TResult> resultSelector)
- public static Boolean All <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Boolean> predicaat)
- public static Boolean Any <TSource> (deze IEnumerable <TSource> bron)
- public static Boolean Elke <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Boolean> predicaat)
- public static IEnumerable <TSource> AsEnumerable <TSource> (deze IEnumerable <TSource> bron)
- public static Decimal Average (deze IEnumerable <Decimal> bron)
- public static Double Average (deze IEnumerable <Double> bron)
- public static Double Average (deze IEnumerable <Int32> bron)
- public static Double Average (deze IEnumerable <Int64> bron)
- public static Nullable <Decimal> Gemiddeld (deze IEnumerable <Nullable <Decimal>> bron)
- public static Nullable <Double> Gemiddeld (deze IEnumerable <Nullable <Double>> bron)
- public static Nullable <Dubbel> Gemiddeld (deze IEnumerable <Nullable <Int32>> bron)
- public static Nullable <Dubbel> Gemiddeld (deze IEnumerable <Nullable <Int64>> bron)
- public static Nullable <Single> Gemiddeld (deze IEnumerable <Nullable <Single>> bron)
- public static Single Average (this IEnumerable <Single> source)
- public static Decimal Average <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Decimal> selector)
- public static Double Average <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Double> selector)
- public static Double Average <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Int32> selector)
- public static Double Average <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Int64> selector)
- public static Nullable <Decimal> Gemiddelde <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Nullable <Decimal>> selector)
- public static Nullable <Double> Gemiddelde <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Nullable <Double>> selector)
- public static Nullable <Double> Gemiddelde <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Nullable <Int32>> selector)
- public static Nullable <Double> Gemiddeld <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Nullable <Int64>> selector)
- public static Nullable <Single> Gemiddelde <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Nullable <Single>> selector)
- public static Single Average <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Single> selector)
- public static IEnumerable <TResult> Cast <TResult> (deze IEnumerable bron)
- public static IEnumerable <TSource> Concat <TSource> (deze IEnumerable <TSource> first, IEnumerable <TSource> second)
- public static Boolean Bevat <TSource> (deze IEnumerable <TSource> bron, TSource-waarde)
- public static Boolean Bevat <TSource> (deze IEnumerable <TSource> -bron, TSource-waarde, IEqualityComparer <TSource> -vergelijker)
- public static Int32 Count <TSource> (deze IEnumerable <TSource> bron)
- public static Int32 Count <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Boolean> predicaat)
- public static IEnumerable <TSource> DefaultIfEmpty <TSource> (deze IEnumerable <TSource> bron)
- public static IEnumerable <TSource> DefaultIfEmpty <TSource> (deze IEnumerable <TSource> bron, TSource defaultValue)
- public static IEnumerable <TSource> Distinct <TSource> (deze IEnumerable <TSource> bron)
- public static IEnumerable <TSource> Distinct <TSource> (deze IEnumerable <TSource> -bron, IEqualityComparer <TSource> -vergelijker)
- public static TSource ElementAt <TSource> (deze IEnumerable <TSource> bron, Int32 index)
- public static TSource ElementAtOrDefault <TSource> (deze IEnumerable <TSource> -bron, Int32-index)
- public static IEnumerable <TResult> Empty <TResult> ()
- public static IEnumerable <TSource> Behalve <TSource> (eerst deze IEnumerable <TSource>, IEnumerable <TSource> second)
- public static IEnumerable <TSource> Behalve <TSource> (eerst deze IEnumerable <TSource>, IEnumerable <TSource> second, IEqualityComparer <TSource> comparer)
- public static TSource First <TSource> (deze IEnumerable <TSource> -bron)
- public static TSource First <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Boolean> predicaat)
- public static TSource FirstOrDefault <TSource> (deze IEnumerable <TSource> bron)
- public static TSource FirstOrDefault <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Boolean> predicaat)
- public static IEnumerable <IGrouping <TKey, TSource >> GroupBy <TSource, TKey> (deze IEnumerable <TSource> source, Func <TSource, TKey> keySelector)
- public static IEnumerable <IGrouping <TKey, TSource >> GroupBy <TSource, TKey> (deze IEnumerable <TSource> source, Func <TSource, TKey> keySelector, IEqualityComparer <TKey> comparer)
- public static IEnumerable <IGrouping <TKey, TElement >> GroupBy <TSource, TKey, TElement> (deze IEnumerable <TSource> bron, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector)
- public static IEnumerable <IGrouping <TKey, TElement >> GroupBy <TSource, TKey, TElement> (deze IEnumerable <TSource> source, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector, IEqualityComparer <TKey> comparer)
- public static IEnumerable <TResult> GroupBy <TSource, TKey, TResult> (deze IEnumerable <TSource> source, Func <TSource, TKey> keySelector, Func <TKey, IEnumerable <TSource>, TResult> resultSelector)
- public static IEnumerable <TResult> GroupBy <TSource, TKey, TResult> (this IEnumerable <TSource> source, Func <TSource, TKey> keySelector, Func <TKey, IEnumerable <TSource>, TResult> resultSelector, IEqualityComparer <TKey> vergelijker)
- public static IEnumerable <TResult> GroupBy <TSource, TKey, TElement, TResult> (this IEnumerable <TSource> source, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector, Func <TKey, IEnumerable <TElement>, TResult > resultSelector)
- public static IEnumerable <TResult> GroupBy <TSource, TKey, TElement, TResult> (this IEnumerable <TSource> source, 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> (this IEnumerable <TOuter> outer, IEnumerable <TInner> inner, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, IEnumer <TInner>, TResult> resultSelector)
- public static IEnumerable <TResult> GroupJoin <TOuter, TInner, TKey, TResult> (this IEnumerable <TOuter> outer, IEnumerable <TInner> inner, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, IEnumer <TInner>, TResult> resultSelector, IEqualityComparer <TKey> comparer)
- public static IEnumerable <TSource> Snijd <TSource> in (eerst deze IEnumerable <TSource>, IEnumerable <TSource> second)
- public static IEnumerable <TSource> Snijd <TSource> in (eerst deze IEnumerable <TSource>, IEnumerable <TSource> second, IEqualityComparer <TSource> comparer)
- public static IEnumerable <TResult> Word lid van <TOuter, TInner, TKey, TResult> (deze IEnumerable <TOuter> outer, IEnumerable <TInner> inner, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, TInner, TResult> resultSelector)
- public static IEnumerable <TResult> Word lid van <TOuter, TInner, TKey, TResult> (deze IEnumerable <TOuter> outer, IEnumerable <TInner> inner, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, TInner, TResult> resultSelector, IEqualityComparer <TKey> comparer)
- public static TSource Laatste <TSource> (deze IEnumerable <TSource> bron)
- public static TSource Laatste <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Boolean> predicaat)
- public static TSource LastOrDefault <TSource> (deze IEnumerable <TSource> -bron)
- public static TSource LastOrDefault <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Boolean> predicaat)
- public static Int64 LongCount <TSource> (deze IEnumerable <TSource> bron)
- public static Int64 LongCount <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Boolean> predicaat)
- public static Decimal Max (deze IEnumerable <Decimal> bron)
- public static Double Max (deze IEnumerable <Double> -bron)
- public static Int32 Max (deze IEnumerable <Int32> bron)
- public static Int64 Max (deze IEnumerable <Int64> bron)
- public static Nullable <Decimal> Max (deze IEnumerable <Nullable <Decimal>> bron)
- public static Nullable <Double> Max (deze IEnumerable <Nullable <Double>> bron)
- public static Nullable <Int32> Max (deze IEnumerable <Nullable <Int32>> bron)
- public static Nullable <Int64> Max (deze IEnumerable <Nullable <Int64>> bron)
- public static Nullable <Single> Max (deze IEnumerable <Nullable <Single>> bron)
- public static Single Max (deze IEnumerable <Single> bron)
- public static TSource Max <TSource> (deze IEnumerable <TSource> -bron)
- public static Decimal Max <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Decimal> selector)
- public static Double Max <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Double> selector)
- public static Int32 Max <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Int32> selector)
- public static Int64 Max <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Int64> selector)
- public static Nullable <Decimal> Max <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Nullable <Decimal>> selector)
- public static Nullable <Double> Max <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Nullable <Double>> selector)
- public static Nullable <Int32> Max <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Nullable <Int32>> selector)
- public static Nullable <Int64> Max <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Nullable <Int64>> selector)
- public static Nullable <Single> Max <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Nullable <Single>> selector)
- public static Single Max <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Single> selector)
- public static TResult Max <TSource, TResult> (deze IEnumerable <TSource> bron, Func <TSource, TResult> selector)
- public static Decimal Min (deze IEnumerable <Decimal> bron)
- public static Double Min (deze IEnumerable <Double> -bron)
- public static Int32 Min (deze IEnumerable <Int32> bron)
- public static Int64 Min (deze IEnumerable <Int64> bron)
- public static Nullable <Decimal> Min (deze IEnumerable <Nullable <Decimal>> bron)
- public static Nullable <Double> Min (deze IEnumerable <Nullable <Double>> bron)
- public static Nullable <Int32> Min (deze IEnumerable <Nullable <Int32>> bron)
- public static Nullable <Int64> Min (deze IEnumerable <Nullable <Int64>> bron)
- public static Nullable <Single> Min (deze IEnumerable <Nullable <Single>> bron)
- public static Single Min (deze IEnumerable <Single> bron)
- public static TSource Min <TSource> (deze IEnumerable <TSource> bron)
- public static Decimal Min <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Decimal> selector)
- public static Double Min <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Double> selector)
- public static Int32 Min <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Int32> selector)
- public static Int64 Min <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Int64> selector)
- public static Nullable <Decimal> Min <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Nullable <Decimal>> selector)
- public static Nullable <Double> Min <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Nullable <Double>> selector)
- public static Nullable <Int32> Min <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Nullable <Int32>> selector)
- public static Nullable <Int64> Min <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Nullable <Int64>> selector)
- public static Nullable <Single> Min <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Nullable <Single>> selector)
- public static Single Min <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Single> selector)
- public static TResult Min <TSource, TResult> (deze IEnumerable <TSource> bron, Func <TSource, TResult> selector)
- public static IEnumerable <TResult> OfType <TResult> (this IEnumerable source)
- public static IOrderedEnumerable <TSource> OrderBy <TSource, TKey> (deze IEnumerable <TSource> source, Func <TSource, TKey> keySelector)
- public static IOrderedEnumerable <TSource> OrderBy <TSource, TKey> (deze IEnumerable <TSource> source, Func <TSource, TKey> keySelector, IComparer <TKey> comparer)
- public static IOrderedEnumerable <TSource> OrderByDescending <TSource, TKey> (deze IEnumerable <TSource> -bron, Func <TSource, TKey> keySelector)
- public static IOrderedEnumerable <TSource> OrderByDescending <TSource, TKey> (deze IEnumerable <TSource> source, Func <TSource, TKey> keySelector, IComparer <TKey> comparer)
- public static IEnumerable <Int32> Range (Int32 start, Int32 count)
- public static IEnumerable <TResult> Repeat <TResult> (TResult element, Int32 count)
- public static IEnumerable <TSource> Reverse <TSource> (deze IEnumerable <TSource> -bron)
- public static IEnumerable <TResult> Selecteer <TSource, TResult> (deze IEnumerable <TSource> source, Func <TSource, TResult> selector)
- public static IEnumerable <TResult> Selecteer <TSource, TResult> (deze IEnumerable <TSource> source, Func <TSource, Int32, TResult> selector)
- public static IEnumerable <TResult> SelectMany <TSource, TResult> (deze IEnumerable <TSource> source, Func <TSource, IEnumerable <TResult>> selector)
- public static IEnumerable <TResult> SelectMany <TSource, TResult> (deze IEnumerable <TSource> source, Func <TSource, Int32, IEnumerable <TResult>> selector)
- public static IEnumerable <TResult> SelectMany <TSource, TCollection, TResult> (this IEnumerable <TSource> source, Func <TSource, IEnumerable <TCollection>> collectionSelector, Func <TSource, TCollection, TResult> resultSelector)
- public static IEnumerable <TResult> SelectMany <TSource, TCollection, TResult> (this IEnumerable <TSource> source, Func <TSource, Int32, IEnumerable <TCollection>> collectionSelector, Func <TSource, TCollection, TResult> resultSelector)
- public static Boolean SequenceEqual <TSource> (eerst deze IEnumerable <TSource>, IEnumerable <TSource> second)
- public static Boolean SequenceEqual <TSource> (deze IEnumerable <TSource> first, IEnumerable <TSource> second, IEqualityComparer <TSource> comparer)
- public static TSource Single <TSource> (deze IEnumerable <TSource> bron)
- public static TSource Single <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Boolean> predicaat)
- public static TSource SingleOrDefault <TSource> (deze IEnumerable <TSource> -bron)
- public static TSource SingleOrDefault <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Boolean> predicaat)
- public static IEnumerable <TSource> Skip <TSource> (deze IEnumerable <TSource> bron, Int32-telling)
- public static IEnumerable <TSource> SkipWhile <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Boolean> predicaat)
- public static IEnumerable <TSource> SkipWhile <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Int32, Boolean> predicaat)
- openbare statische decimale som (deze IEnumerable <Decimal> -bron)
- openbare statische Double Sum (deze IEnumerable <Double> -bron)
- public static Int32 Sum (deze IEnumerable <Int32> bron)
- public static Int64 Sum (deze IEnumerable <Int64> bron)
- public static Nullable <Decimal> Sum (deze IEnumerable <Nullable <Decimal>> bron)
- public static Nullable <Double> Sum (deze IEnumerable <Nullable <Double>> bron)
- public static Nullable <Int32> Som (deze IEnumerable <Nullable <Int32>> bron)
- public static Nullable <Int64> Som (deze IEnumerable <Nullable <Int64>> bron)
- public static Nullable <Single> Sum (deze IEnumerable <Nullable <Single>> bron)
- public static Single Sum (deze IEnumerable <Single> bron)
- public static Decimal Sum <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Decimal> selector)
- public static Double Sum <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Double> selector)
- public static Int32 Sum <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Int32> selector)
- public static Int64 Sum <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Int64> selector)
- public static Nullable <Decimal> Sum <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Nullable <Decimal>> selector)
- public static Nullable <Double> Sum <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Nullable <Double>> selector)
- public static Nullable <Int32> Sum <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Nullable <Int32>> selector)
- public static Nullable <Int64> Sum <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Nullable <Int64>> selector)
- public static Nullable <Single> Sum <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Nullable <Single>> selector)
- public static Single Sum <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Single> selector)
- public static IEnumerable <TSource> Neem <TSource> (deze IEnumerable <TSource> bron, Int32-telling)
- public static IEnumerable <TSource> TakeWhile <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Boolean> predicaat)
- public static IEnumerable <TSource> TakeWhile <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Int32, Boolean> predicaat)
- public static IOrderedEnumerable <TSource> ThenBy <TSource, TKey> (deze IOrderedEnumerable <TSource> bron, Func <TSource, TKey> keySelector)
- public static IOrderedEnumerable <TSource> ThenBy <TSource, TKey> (deze IOrderedEnumerable <TSource> bron, Func <TSource, TKey> keySelector, IComparer <TKey> comparer)
- public static IOrderedEnumerable <TSource> ThenByDescending <TSource, TKey> (deze IOrderedEnumerable <TSource> bron, Func <TSource, TKey> keySelector)
- public static IOrderedEnumerable <TSource> ThenByDescending <TSource, TKey> (deze IOrderedEnumerable <TSource> bron, Func <TSource, TKey> keySelector, IComparer <TKey> comparer)
- openbare statische TSource [] ToArray <TSource> (deze IEnumerable <TSource> bron)
- public static Dictionary <TKey, TSource> ToDictionary <TSource, TKey> (deze IEnumerable <TSource> -bron, Func <TSource, TKey> keySelector)
- public static Dictionary <TKey, TSource> ToDictionary <TSource, TKey> (deze IEnumerable <TSource> -bron, Func <TSource, TKey> keySelector, IEqualityComparer <TKey> -vergelijker)
- public static Dictionary <TKey, TElement> ToDictionary <TSource, TKey, TElement> (deze IEnumerable <TSource> bron, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector)
- public static Dictionary <TKey, TElement> ToDictionary <TSource, TKey, TElement> (deze IEnumerable <TSource> source, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector, IEqualityComparer <TKey> comparer)
- public static List <TSource> ToList <TSource> (deze IEnumerable <TSource> bron)
- public static ILookup <TKey, TSource> ToLookup <TSource, TKey> (deze IEnumerable <TSource> source, Func <TSource, TKey> keySelector)
- public static ILookup <TKey, TSource> ToLookup <TSource, TKey> (deze IEnumerable <TSource> source, Func <TSource, TKey> keySelector, IEqualityComparer <TKey> comparer)
- public static ILookup <TKey, TElement> ToLookup <TSource, TKey, TElement> (deze IEnumerable <TSource> source, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector)
- public static ILookup <TKey, TElement> ToLookup <TSource, TKey, TElement> (deze IEnumerable <TSource> source, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector, IEqualityComparer <TKey> comparer)
- public static IEnumerable <TSource> Union <TSource> (deze IEnumerable <TSource> first, IEnumerable <TSource> second)
- public static IEnumerable <TSource> Union <TSource> (deze IEnumerable <TSource> first, IEnumerable <TSource> second, IEqualityComparer <TSource> comparer)
- public static IEnumerable <TSource> Where <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Boolean> predicaat)
- public static IEnumerable <TSource> Where <TSource> (deze IEnumerable <TSource> bron, Func <TSource, Int32, Boolean> predicaat)
- public static IEnumerable <TResult> Zip <TFirst, TSecond, TResult> (deze IEnumerable <TFirst> first, IEnumerable <TSecond> second, Func <TFirst, TSecond, TResult> resultSelector)
Opmerkingen
- Zie ook LINQ .
De ingebouwde LINQ-methoden zijn uitbreidingsmethoden voor de IEnumerable<T>
-interface die in de klasse System.Linq.Enumerable
in de System.Core
assembly aanwezig zijn. Ze zijn beschikbaar in .NET Framework 3.5 en hoger.
LINQ maakt eenvoudige aanpassing, transformatie en combinatie van verschillende IEnumerable
s mogelijk met behulp van een query-achtige of functionele syntaxis.
Hoewel de standaard LINQ-methoden kunnen werken op elke IEnumerable<T>
, inclusief de eenvoudige arrays en List<T>
s, kunnen ze ook worden gebruikt voor databaseobjecten, waar de set LINQ-expressies in veel gevallen kan worden omgezet naar SQL als de data-object ondersteunt het. Zie LINQ naar SQL .
Voor de methoden die objecten vergelijken (zoals Contains
en Except
), wordt IEquatable<T>.Equals
gebruikt als het type T van de verzameling die interface implementeert. Anders is de standaard Equals
en GetHashCode
van het type (eventueel overschreven van de standaard Object
implementaties) worden gebruikt. Er zijn ook overbelastingen voor deze methoden waarmee u een aangepaste IEqualityComparer<T>
kunt opgeven.
Voor de ...OrDefault
methoden wordt default(T)
gebruikt om standaardwaarden te genereren.
Officiële referentie: opsombare klasse
Luie evaluatie
Vrijwel elke query die een IEnumerable<T>
retourneert, wordt niet onmiddellijk geëvalueerd; in plaats daarvan wordt de logica vertraagd totdat de query wordt herhaald. Een implicatie is dat elke keer dat iemand een IEnumerable<T>
herhaalt die is gemaakt op basis van een van deze query's, bijvoorbeeld .Where()
, de volledige .Where()
wordt herhaald. Als het predicaat lang aanhoudt, kan dit een oorzaak zijn voor prestatieproblemen.
Een eenvoudige oplossing (als u de geschatte grootte van de resulterende reeks weet of kunt bepalen) is om de resultaten volledig te bufferen met .ToArray()
of .ToList()
. .ToDictionary()
of .ToLookup()
kunnen dezelfde rol vervullen. Je kunt natuurlijk ook de hele reeks herhalen en de elementen bufferen volgens andere aangepaste logica.
ToArray()
of ToList()
?
Zowel .ToArray()
als .ToList()
doorlopen alle elementen van een IEnumerable<T>
-reeks en slaan de resultaten op in een verzameling die in het geheugen is opgeslagen. Gebruik de volgende richtlijnen om te bepalen welke te kiezen:
- Sommige API's vereisen mogelijk een
T[]
of eenList<T>
. -
.ToList()
doorgaans sneller uitgevoerd en genereert minder afval dan.ToArray()
, omdat de laatste alle elementen een keer meer dan één keer naar de nieuwe verzameling met een vaste grootte moet kopiëren, in bijna alle gevallen. - Elementen kunnen worden toegevoegd aan of verwijderd uit de
List<T>
geretourneerd door.ToList()
, terwijl deT[]
geretourneerd door.ToArray()
gedurende de hele levensduur een vaste grootte blijft. Met andere woorden,List<T>
is veranderlijk enT[]
is onveranderlijk. - De
T[]
geretourneerd door.ToArray()
gebruikt minder geheugen dan deList<T>
geretourneerd door.ToList()
, dus als het resultaat voor langere tijd wordt opgeslagen, geeft u de voorkeur aan.ToArray()
.List<T>.TrimExcess()
zou het geheugenverschil strikt academisch maken, ten koste van het elimineren van het relatieve snelheidsvoordeel van.ToList()
.
Selecteer (kaart)
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
Dit type functie wordt meestal map
in functionele programmeertalen.
Waar (filter)
Deze methode retourneert een IEnumerable met alle elementen die voldoen aan de lambda-expressie
Voorbeeld
var personNames = new[]
{
"Foo", "Bar", "Fizz", "Buzz"
};
var namesStartingWithF = personNames.Where(p => p.StartsWith("F"));
Console.WriteLine(string.Join(",", namesStartingWithF));
Output:
Foo, Fizz
OrderBy
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
bevat
var numbers = new[] {1,2,3,4,5};
Console.WriteLine(numbers.Contains(3)); //True
Console.WriteLine(numbers.Contains(34)); //False
Behalve
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
Snijden
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
Merk op dat duplicaten in het resultaat worden bewaard. Gebruik in plaats daarvan Union
als dit ongewenst is.
Eerst (vinden)
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
De volgende worpen InvalidOperationException
met bericht "Volgorde bevat geen overeenkomend element":
var firstNegativeNumber = numbers.First(n => n < 0);
single
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
Het volgende gooit InvalidOperationException
omdat er meer dan één element in de reeks is:
var theOnlyNumberInNumbers = numbers.Single();
var theOnlyNegativeNumber = numbers.Single(n => n < 0);
Laatste
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
De volgende gooit 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
De volgende gooit 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
Ieder
Retourneert true
als de verzameling elementen bevat die voldoen aan de voorwaarde in de lambda-expressie:
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
Allemaal
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
Merk op dat de methode All
werkt door te controleren of het eerste element volgens het predicaat als false
geëvalueerd. Daarom retourneert de methode true
voor elk predicaat in het geval dat de set leeg is:
var numbers = new int[0];
var allNumbersArePositive = numbers.All(n => n > 0);
Console.WriteLine(allNumbersArePositive); //True
SelectMany (vlakke kaart)
Enumerable.Select
retourneert een uitvoerelement voor elk Enumerable.Select
. Terwijl Enumerable.SelectMany
produceert een variabel aantal uitvoerelementen voor elk Enumerable.SelectMany
. Dit betekent dat de uitvoerreeks meer of minder elementen kan bevatten dan in de invoerreeks.
Lambda expressions
doorgegeven aan Enumerable.Select
moeten één item retourneren. Lambda-expressies die zijn doorgegeven aan Enumerable.SelectMany
moeten een onderliggende reeks produceren. Deze onderliggende reeks kan een variërend aantal elementen bevatten voor elk element in de invoersequentie.
Voorbeeld
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()));
Output:
1,2,3,4,5,6
Enumerable.SelectMany
kan ook worden bereikt met een syntax-gebaseerde query met twee opeenvolgende from
clausules:
var allInvoicesFromAllCustomers
= from customer in customers
from invoice in customer.Invoices
select invoice;
Som
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
Overspringen
Overslaan somt de eerste N items op zonder ze te retourneren. Zodra itemnummer N + 1 is bereikt, begint Skip met het retourneren van elk opgesomd item:
var numbers = new[] {1,2,3,4,5};
var allNumbersExceptFirstTwo = numbers.Skip(2);
Console.WriteLine(string.Join(",", allNumbersExceptFirstTwo.ToArray()));
//3,4,5
Nemen
Deze methode neemt de eerste n
elementen uit een opsomming.
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
Omgekeerde
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
Gemiddelde
var numbers = new[] {1,2,3,4};
var averageNumber = numbers.Average();
Console.WriteLine(averageNumber);
// 2,5
Deze methode berekent het gemiddelde van de telling van getallen.
var cities = new[] {
new {Population = 1000},
new {Population = 2000},
new {Population = 4000}
};
var averagePopulation = cities.Average(c => c.Population);
Console.WriteLine(averagePopulation);
// 2333,33
Deze methode berekent het gemiddelde van de telling met behulp van de gedelegeerde functie.
ritssluiting
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
onderscheiden
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
GroupBy
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
Groepsfacturen per land, genereert een nieuw object met het aantal records, totaal betaald en gemiddeld betaald
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) });
Als we alleen de totalen willen, geen groep
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) });
Als we meerdere tellingen nodig hebben
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
Retourneert een nieuw woordenboek van de bron IEnumerable
met behulp van de meegeleverde keySelector-functie om sleutels te bepalen. Zal een ArgumentException
genereren als keySelector niet injectief is (retourneert een unieke waarde voor elk lid van de broncollectie.) Er zijn overbelastingen die het mogelijk maken om zowel de te bewaren waarde als de sleutel op te geven.
var persons = new[] {
new { Name="Fizz", Id=1},
new { Name="Buzz", Id=2},
new { Name="Foo", Id=3},
new { Name="Bar", Id=4},
};
Als u alleen een sleutelkiezerfunctie Dictionary<TKey,TVal>
wordt een Dictionary<TKey,TVal>
met TKey
het TKey
van de sleutelkiezer, TVal
het oorspronkelijke objecttype en het oorspronkelijke object als de opgeslagen waarde.
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
Als u ook een Dictionary<TKey,TVal>
wordt een Dictionary<TKey,TVal>
met TKey
nog steeds het TKey
van de sleutelkiezer, maar TVal
nu het TVal
de TVal
en de geretourneerde waarde als de opgeslagen waarde.
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
Zoals hierboven vermeld, moeten de sleutels die door de sleutelkiezer worden geretourneerd uniek zijn. Het volgende zal een uitzondering veroorzaken.
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)
Als u geen unieke sleutel kunt opgeven voor de bronverzameling, kunt u overwegen om ToLookup te gebruiken. Aan de oppervlakte gedraagt ToLookup zich op dezelfde manier als ToDictionary, maar in de resulterende Lookup wordt elke sleutel gekoppeld aan een verzameling waarden met overeenkomende sleutels.
Unie
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
Merk op dat duplicaten uit het resultaat worden verwijderd. Gebruik Concat
als dit ongewenst is.
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[]
ToList
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
tellen
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
Aggregeren (vouwen)
Bij elke stap een nieuw object genereren:
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,
In alle stappen hetzelfde object gebruiken:
var commaSeparatedElements2 = elements.Aggregate(
seed: new StringBuilder(),
func: (seed, element) => seed.Append($"{element},"));
Console.WriteLine(commaSeparatedElements2.ToString()); //1,2,3,4,5,
Met behulp van een resultaatkiezer:
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,
Als een zaad wordt weggelaten, wordt het eerste element het zaad:
var seedAndElements = elements.Select(n=>n.ToString());
var commaSeparatedElements4 = seedAndElements.Aggregate(
func: (aggregate, element) => $"{aggregate}{element},");
Console.WriteLine(commaSeparatedElements4); //12,3,4,5,
Opkijken
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
toetreden
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
Gips
Cast
verschilt van de andere methoden van Enumerable
omdat het een uitbreidingsmethode is voor IEnumerable
, niet voor IEnumerable<T>
. Het kan dus worden gebruikt om instanties van de eerste om te zetten in instanties van de latere.
Dit compileert niet omdat ArrayList
geen IEnumerable<T>
implementeert:
var numbers = new ArrayList() {1,2,3,4,5};
Console.WriteLine(numbers.First());
Dit werkt zoals verwacht:
var numbers = new ArrayList() {1,2,3,4,5};
Console.WriteLine(numbers.Cast<int>().First()); //1
Cast
voert geen conversiecasts uit. Het volgende compileert maar gooit InvalidCastException
tijdens runtime:
var numbers = new int[] {1,2,3,4,5};
decimal[] numbersAsDecimal = numbers.Cast<decimal>().ToArray();
De juiste manier om een conversie cast naar een verzameling uit te voeren is als volgt:
var numbers= new int[] {1,2,3,4,5};
decimal[] numbersAsDecimal = numbers.Select(n => (decimal)n).ToArray();
Leeg
Om een lege IEnumerable van int te maken:
IEnumerable<int> emptyList = Enumerable.Empty<int>();
Deze lege IEnumerable wordt in de cache opgeslagen voor elke Type T, zodat:
Enumerable.Empty<decimal>() == Enumerable.Empty<decimal>(); // This is True
Enumerable.Empty<int>() == Enumerable.Empty<decimal>(); // This is False
ThenBy
ThenBy
kan alleen worden gebruikt na een OrderBy
clausule die het mogelijk maakt om met meerdere criteria te bestellen
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
reeks
De twee parameters voor Range
zijn het eerste getal en het aantal te produceren elementen (niet het laatste getal).
// 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)));
Linker buitenaansluiting
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}");
}
Herhaling
Enumerable.Repeat
genereert een reeks van een herhaalde waarde. In dit voorbeeld genereert het 4 keer "Hallo".
var repeats = Enumerable.Repeat("Hello", 4);
foreach (var item in repeats)
{
Console.WriteLine(item);
}
/* output:
Hello
Hello
Hello
Hello
*/