Sök…
Introduktion
LINQ (Language Integrated Query) är ett uttryck som hämtar data från en datakälla. LINQ förenklar denna situation genom att erbjuda en konsekvent modell för att arbeta med data över olika typer av datakällor och format. I en LINQ-fråga arbetar du alltid med objekt. Du använder samma grundläggande kodningsmönster för att fråga och transformera data i XML-dokument, SQL-databaser, ADO.NET-databas, .NET-samlingar och alla andra format som en leverantör är tillgänglig för. LINQ kan användas i C # och VB.
Syntax
- public static TSource Aggregate <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, TSource, TSource> func)
- public static TAccumulate Aggregate <TSource, TAccumulate> (denna IEnumerable <TSource> -källa, TAccumulate seed, Func <TAccumulate, TSource, TAccumulate> func)
- public static TResult Aggregate <TSource, TAccumulate, TResult> (denna IEnumerable <TSource> -källa, TAccumulate seed, Func <TAccumulate, TSource, TAccumulate> func, Func <TAccumulate, TResult> resultSelector)
- public static Boolean All <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Boolean> predikat)
- public static Boolean Any <TSource> (denna IEnumerable <TSource> -källa)
- public static Boolean Any <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Boolean> predikat)
- public static IEnumerable <TSource> AsEnumerable <TSource> (denna IEnumerable <TSource> -källa)
- offentligt statiskt decimalt medelvärde (denna IEnumerable <Decimal> källa)
- offentligt statiskt dubbel genomsnitt (denna IEnumerable <Double> -källa)
- offentligt statiskt dubbel genomsnitt (denna IEnumerable <Int32> källa)
- offentligt statiskt dubbel genomsnitt (denna IEnumerable <Int64> källa)
- public static Nullable <Decimal> Average (denna IEnumerable <Nullable <Decimal>> källa)
- public static Nullable <Double> Average (denna IEnumerable <Nullable <Double>> källa)
- public static Nullable <Double> Average (denna IEnumerable <Nullable <Int32>> källa)
- public static Nullable <Double> Average (denna IEnumerable <Nullable <Int64>> källa)
- public static Nullable <Single> Average (denna IEnumerable <Nullable <Single>> källa)
- offentligt statiskt enda genomsnitt (denna IEnumerable <Single> -källa)
- public static Decimal Average <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Decimal> selector)
- offentlig statisk dubbel genomsnitt <Källa> (denna IEnumerable <Källa> källa, Func <TSource, Double> selector)
- offentlig statisk dubbel genomsnitt <Källa> (denna IEnumerable <Källa> källa, Func <TSource, Int32> selector)
- offentlig statisk dubbel genomsnitt <Källa> (denna IEnumerable <Källa> källa, Func <TSource, Int64> selector)
- public static Nullable <Decimal> Average <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Nullable <Decimal>> selector)
- public static Nullable <Double> Average <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Nullable <Double>> -väljare)
- public static Nullable <Double> Average <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Nullable <Int32>> selector)
- public static Nullable <Double> Average <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Nullable <Int64>> selector)
- public static Nullable <Single> Average <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Nullable <Single>> selector)
- public static Enkel genomsnitt <Källa> (denna IUtalbara <Källa> källa, Func <TSource, Singel> selector)
- public static IEnumerable <TResult> Cast <TResult> (denna IEnumerable källa)
- public static IEnumerable <TSource> Concat <TSource> (denna IEnumerable <TSource> först, IEnumerable <TSource> second)
- public static Boolean Innehåller <TSource> (denna IEnumerable <TSource> -källa, TSource-värde)
- public static Boolean Innehåller <Source> (denna IEnumerable <TSource> -källa, TSource-värde, IEqualityComparer <Source> jämförare)
- public static Int32 Count <TSource> (denna IEnumerable <TSource> -källa)
- public static Int32 Count <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Boolean> predikat)
- public static IEnumerable <TSource> StandardIfEmpty <TSource> (denna IEnumerable <TSource> -källa)
- public static IEnumerable <TSource> StandardIfEmpty <TSource> (denna IEnumerable <TSource> -källa, TSource defaultValue)
- public static IEnumerable <TSource> Distinct <TSource> (denna IEnumerable <TSource> -källa)
- public static IEnumerable <TSource> Distinct <TSource> (denna IEnumerable <TSource> -källa, IEqualityComparer <Source> jämförare)
- public static TSource ElementAt <TSource> (denna IEnumerable <TSource> -källa, Int32-index)
- public static TSource ElementAtOrDefault <TSource> (denna IEnumerable <TSource> -källa, Int32-index)
- public static IEnumerable <TResult> Tom <TResult> ()
- public static IEnumerable <TSource> Undantagen <TSource> (denna IEnumerable <TSource> först, IEnumerable <TSource> second)
- public static IEnumerable <TSource> Undantagen <TSource> (denna IEnumerable <TSource> först, IEnumerable <TSource> second, IEqualityComparer <Source> jämförare)
- public static TSource First <TSource> (denna IEnumerable <TSource> -källa)
- public static TSource First <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Boolean> predikat)
- public static TSource FirstOrDefault <TSource> (denna IEnumerable <TSource> -källa)
- public static TSource FirstOrDefault <ource> (denna IEnumerable <TSource> -källa, Func <TSource, Boolean> predikat)
- public static IEnumerable <IGrouping <TKey, TSource >> GroupBy <TSource, TKey> (denna IEnumerable <Source> -källa, Func <TSource, TKey> keySelector)
- public static IEnumerable <IGrouping <TKey, TSource >> GroupBy <TSource, TKey> (denna IEnumerable <Source> källa, Func <TSource, TKey> keySelector, IEqualityComparer <TKey> jämförare)
- public static IEnumerable <IGrouping <TKey, TElement >> GroupBy <TSource, TKey, TElement> (denna IEnumerable <Source> -källa, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector)
- public static IEnumerable <IGrouping <TKey, TElement >> GroupBy <TSource, TKey, TElement> (denna IEnumerable <Source> källa, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector, IEqualityComparer <TKey> jämförare)
- public static IEnumerable <TResult> GroupBy <TSource, TKey, TResult> (denna IEnumerable <Source> -källa, Func <TSource, TKey> keySelector, Func <TKey, IEnumerable <TSource>, TResult> resultSelector)
- public static IEnumerable <TResult> GroupBy <TSource, TKey, TResult> (denna IEnumerable <Source> -källa, Func <TSource, TKey> keySelector, Func <TKey, IEnumerable <TSource>, TResult> resultSelector, IEqualityComparer <TKey> jämförare)
- public static IEnumerable <TResult> GroupBy <TSource, TKey, TElement, TResult> (denna IEnumerable <Source> -källa, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector, Func <TKey, IEnumerable <TElement>, TResult > resultSelector)
- public static IEnumerable <TResult> GroupBy <TSource, TKey, TElement, TResult> (denna IEnumerable <Source> -källa, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector, Func <TKey, IEnumerable <TElement>, TResult > resultatVäljare, IEqualityComparer <TKey> jämförare)
- public static IEnumerable <TResult> GroupJoin <TOuter, TInner, TKey, TResult> (denna IEnumerable <TOuter> ytre, IEnumerable <Tinner> inner, Func <TOuter, TKey> ytterKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, IEnumerable <Tinner>, TResult> resultSelector)
- public static IEnumerable <TResult> GroupJoin <TOuter, TInner, TKey, TResult> (denna IEnumerable <TOuter> ytre, IEnumerable <Tinner> inner, Func <TOuter, TKey> ytterKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, IEnumerable <TInner>, TResult> resultSelector, IEqualityComparer <TKey> jämförare)
- public static IEnumerable <TSource> Crossing <TSource> (denna IEnumerable <TSource> först, IEnumerable <TSource> second)
- public static IEnumerable <TSource> Crossing <TSource> (denna IEnumerable <TSource> först, IEnumerable <Source> second, IEqualityComparer <Source> jämförare)
- public static IEnumerable <TResult> Join <TOuter, TInner, TKey, TResult> (denna IEnumerable <TOuter> ytter, IEnumerable <Tinner> inner, Func <TOuter, TKey> ytterKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, TInner, TResult> resultSelector)
- public static IEnumerable <TResult> Join <TOuter, TInner, TKey, TResult> (denna IEnumerable <TOuter> ytter, IEnumerable <Tinner> inner, Func <TOuter, TKey> ytterKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, TInner, TResult> resultSelector, IEqualityComparer <TKey> jämförare)
- public static TSource Last <TSource> (denna IEnumerable <TSource> -källa)
- public static TSource Last <TSource> (denna IEnumerable <ource> -källa, Func <TSource, Boolean> predikat)
- offentlig statisk TSource LastOrDefault <Källa> (denna IEnumerable <Källa> källa)
- offentlig statisk TSource LastOrDefault <Källa> (denna IEnumerable <Källa> källa, Func <TSource, Boolean> predikat)
- public static Int64 LongCount <TSource> (denna IEnumerable <TSource> -källa)
- public static Int64 LongCount <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Boolean> predikat)
- public static Decimal Max (denna IEnumerable <Decimal> källa)
- public static Double Max (denna IEnumerable <Double> -källa)
- public static Int32 Max (denna IEnumerable <Int32> källa)
- public static Int64 Max (denna IEnumerable <Int64> källa)
- public static Nullable <Decimal> Max (denna IEnumerable <Nullable <Decimal>> källa)
- public static Nullable <Double> Max (denna IEnumerable <Nullable <Double>> källa)
- public static Nullable <Int32> Max (denna IEnumerable <Nullable <Int32>> källa)
- public static Nullable <Int64> Max (denna IEnumerable <Nullable <Int64>> källa)
- public static Nullable <Single> Max (denna IEnumerable <Nullable <Single>> källa)
- public static Single Max (denna IEnumerable <Single> -källa)
- public static TSource Max <TSource> (denna IEnumerable <ource> -källa)
- public static Decimal Max <TSource> (denna IEnumerable <TSource> källa, Func <TSource, Decimal> selector)
- public static Double Max <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Double> -väljare)
- public static Int32 Max <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Int32> -väljare)
- public static Int64 Max <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Int64> -väljare)
- public static Nullable <Decimal> Max <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Nullable <Decimal>> selector)
- public static Nullable <Double> Max <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Nullable <Double>> -väljare)
- public static Nullable <Int32> Max <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Nullable <Int32>> selector)
- public static Nullable <Int64> Max <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Nullable <Int64>> selector)
- public static Nullable <Single> Max <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Nullable <Single>> -väljare)
- public static Single Max <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Single> -väljare)
- public static TResult Max <TSource, TResult> (denna IEnumerable <TSource> källa, Func <TSource, TResult> selector)
- public static Decimal Min (denna IEnumerable <Decimal> källa)
- public static Double Min (denna IEnumerable <Double> -källa)
- public static Int32 Min (denna IEnumerable <Int32> källa)
- public static Int64 Min (denna IEnumerable <Int64> källa)
- public static Nullable <Decimal> Min (denna IEnumerable <Nullable <Decimal>> källa)
- public static Nullable <Double> Min (denna IEnumerable <Nullable <Double>> källa)
- public static Nullable <Int32> Min (denna IEnumerable <Nullable <Int32>> källa)
- public static Nullable <Int64> Min (denna IEnumerable <Nullable <Int64>> källa)
- public static Nullable <Single> Min (denna IEnumerable <Nullable <Single>> källa)
- public static Single Min (denna IEnumerable <Single> -källa)
- public static TSource Min <TSource> (denna IEnumerable <TSource> -källa)
- public static Decimal Min <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Decimal> selector)
- public static Double Min <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Double> -väljare)
- public static Int32 Min <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Int32> -väljare)
- public static Int64 Min <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Int64> -väljare)
- public static Nullable <Decimal> Min <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Nullable <Decimal>> selector)
- public static Nullable <Double> Min <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Nullable <Double>> -väljare)
- public static Nullable <Int32> Min <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Nullable <Int32>> selector)
- public static Nullable <Int64> Min <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Nullable <Int64>> selector)
- public static Nullable <Single> Min <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Nullable <Single>> selector)
- public static Single Min <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Single> -väljare)
- public static TResult Min <TSource, TResult> (denna IEnumerable <TSource> källa, Func <TSource, TResult> selector)
- public static IEnumerable <TResult> OfType <TResult> (denna IEnumerable källa)
- public static IOrderedEnumerable <TSource> OrderBy <TSource, TKey> (denna IEnumerable <TSource> -källa, Func <TSource, TKey> keySelector)
- public static IOrderedEnumerable <TSource> OrderBy <TSource, TKey> (denna IEnumerable <TSource> -källa, Func <TSource, TKey> keySelector, IComparer <TKey> jämförare)
- public static IOrderedEnumerable <Source> OrderByDescending <TSource, TKey> (denna IEnumerable <TSource> -källa, Func <TSource, TKey> keySelector)
- public static IOrderedEnumerable <TSource> OrderByDescending <TSource, TKey> (denna IEnumerable <Source> källa, Func <TSource, TKey> keySelector, IComparer <TKey> jämförare)
- 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> (denna IEnumerable <TSource> -källa)
- public static IEnumerable <TResult> Välj <TSource, TResult> (denna IEnumerable <TSource> -källa, Func <TSource, TResult> selector)
- public static IEnumerable <TResult> Välj <TSource, TResult> (denna IEnumerable <TSource> -källa, Func <TSource, Int32, TResult> selector)
- public static IEnumerable <TResult> SelectMany <TSource, TResult> (denna IEnumerable <TSource> -källa, Func <TSource, IEnumerable <TResult>> selector)
- public static IEnumerable <TResult> SelectMany <TSource, TResult> (denna IEnumerable <TSource> -källa, Func <TSource, Int32, IEnumerable <TResult>> selector)
- public static IEnumerable <TResult> SelectMany <TSource, TCollection, TResult> (denna IEnumerable <Source> -källa, Func <TSource, IEnumerable <TCollection>> collectionSelector, Func <TSource, TCollection, TResult> resultSelector)
- public static IEnumerable <TResult> SelectMany <TSource, TCollection, TResult> (denna IEnumerable <Source> källa, Func <TSource, Int32, IEnumerable <TCollection>> collectionSelector, Func <TSource, TCollection, TResult> resultSelector)
- public static Boolean SequenceEqual <Source> (denna IEnumerable <TSource> först, IEnumerable <TSource> second)
- public static Boolean SequenceEqual <Source> (denna IEnumerable <Source> först, IEnumerable <TSource> second, IEqualityComparer <Source> jämförare)
- public static TSource Single <TSource> (denna IEnumerable <TSource> -källa)
- public static TSource Single <TSource> (denna IEnumerable <ource> -källa, Func <TSource, Boolean> predikat)
- offentlig statisk TSource SingleOrDefault <Källa> (denna IEnumerable <Källa> källa)
- public static TSource SingleOrDefault <Source> (denna IEnumerable <TSource> -källa, Func <TSource, Boolean> predikat)
- public static IEnumerable <TSource> Hoppa över <TSource> (denna IEnumerable <TSource> -källa, Int32-räkning)
- public static IEnumerable <TSource> SkipWhile <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Boolean> predikat)
- public static IEnumerable <TSource> SkipWhile <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Int32, Boolean> predikat)
- public static Decimal Sum (denna IEnumerable <Decimal> källa)
- public static Double Sum (denna IEnumerable <Double> -källa)
- public static Int32 Sum (denna IEnumerable <Int32> källa)
- public static Int64 Sum (denna IEnumerable <Int64> källa)
- public static Nullable <Decimal> Sum (denna IEnumerable <Nullable <Decimal>> källa)
- public static Nullable <Double> Sum (denna IEnumerable <Nullable <Double>> källa)
- public static Nullable <Int32> Sum (denna IEnumerable <Nullable <Int32>> källa)
- public static Nullable <Int64> Sum (denna IEnumerable <Nullable <Int64>> källa)
- public static Nullable <Single> Sum (denna IEnumerable <Nullable <Single>> källa)
- public static Single Sum (denna IEnumerable <Single> -källa)
- public static Decimal Sum <TSource> (denna IEnumerable <TSource> källa, Func <TSource, Decimal> selector)
- public static Double Sum <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Double> -väljare)
- public static Int32 Sum <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Int32> -väljare)
- public static Int64 Sum <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Int64> -väljare)
- public static Nullable <Decimal> Sum <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Nullable <Decimal>> selector)
- public static Nullable <Double> Sum <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Nullable <Double>> -väljare)
- public static Nullable <Int32> Sum <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Nullable <Int32>> selector)
- public static Nullable <Int64> Sum <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Nullable <Int64>> selector)
- public static Nullable <Single> Sum <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Nullable <Single>> selector)
- public static Enkel summa <Källa> (denna IEnumerable <Källa> källa, Func <TSource, Single> selector)
- public static IEnumerable <TSource> Take <TSource> (denna IEnumerable <TSource> -källa, Int32-räkning)
- public static IEnumerable <TSource> TakeWhile <Source> (denna IEnumerable <TSource> -källa, Func <TSource, Boolean> predikat)
- public static IEnumerable <Source> TakeWhile <Source> (denna IEnumerable <TSource> -källa, Func <TSource, Int32, Boolean> predikat)
- public static IOrderedEnumerable <Source> ThenBy <TSource, TKey> (denna IOrderedEnumerable <Source> källa, Func <TSource, TKey> keySelector)
- public static IOrderedEnumerable <TSource> ThenBy <TSource, TKey> (denna IOrderedEnumerable <Source> källa, Func <TSource, TKey> keySelector, IComparer <TKey> jämförare)
- public static IOrderedEnumerable <TSource> ThenByDescending <TSource, TKey> (denna IOrderedEnumerable <Source> källa, Func <TSource, TKey> keySelector)
- public static IOrderedEnumerable <TSource> ThenByDescending <TSource, TKey> (denna IOrderedEnumerable <Source> källa, Func <TSource, TKey> keySelector, IComparer <TKey> jämförare)
- public static TSource [] ToArray <Source> (denna IEnumerable <TSource> -källa)
- public static Dictionary <TKey, TSource> ToDiction <TSource, TKey> (denna IEnumerable <Source> -källa, Func <TSource, TKey> keySelector)
- public static Dictionary <TKey, TSource> ToDiction <TSource, TKey> (denna IEnumerable <Source> -källa, Func <TSource, TKey> keySelector, IEqualityComparer <TKey> jämförare)
- public static Dictionary <TKey, TElement> ToDiction <TSource, TKey, TElement> (denna IEnumerable <Source> -källa, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector)
- public static Dictionary <TKey, TElement> ToDiction <TSource, TKey, TElement> (denna IEnumerable <Source> -källa, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector, IEqualityComparer <TKey> jämförare)
- offentlig statisk lista <Källa> ToList <Källa> (denna IEnumerable <Källa> källa)
- public static ILookup <TKey, TSource> ToLookup <TSource, TKey> (denna IEnumerable <TSource> -källa, Func <TSource, TKey> keySelector)
- public static ILookup <TKey, TSource> ToLookup <TSource, TKey> (denna IEnumerable <Source> -källa, Func <TSource, TKey> keySelector, IEqualityComparer <TKey> jämförare)
- public static ILookup <TKey, TElement> ToLookup <TSource, TKey, TElement> (denna IEnumerable <Source> -källa, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector)
- public static ILookup <TKey, TElement> ToLookup <TSource, TKey, TElement> (denna IEnumerable <Source> källa, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector, IEqualityComparer <TKey> jämförare)
- public static IEnumerable <TSource> Union <TSource> (denna IEnumerable <TSource> först, IEnumerable <TSource> second)
- public static IEnumerable <TSource> Union <TSource> (denna IEnumerable <TSource> först, IEnumerable <TSource> second, IEqualityComparer <Source> jämförare)
- public static IEnumerable <TSource> Where <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Boolean> predikat)
- public static IEnumerable <TSource> Where <TSource> (denna IEnumerable <TSource> -källa, Func <TSource, Int32, Boolean> predikat)
- public static IEnumerable <TResult> Zip <TFirst, TSecond, TResult> (denna IEnumerable <TFirst> först, IEnumerable <TSecond> second, Func <TFirst, TSecond, TResult> resultSelector)
Anmärkningar
- Se även LINQ .
De inbyggda LINQ-metoderna är förlängningsmetoder för IEnumerable<T>
-gränssnittet som lever i klassen System.Linq.Enumerable
i System.Linq.Enumerable
System.Core
. De finns tillgängliga i .NET Framework 3.5 och senare.
LINQ möjliggör enkel modifiering, transformation och kombination av olika IEnumerable
hjälp av en fråga-liknande eller funktionell syntax.
Medan standard LINQ-metoderna kan fungera på alla IEnumerable<T>
, inklusive de enkla matriserna och List<T>
, kan de också användas på databasobjekt, där uppsättningen av LINQ-uttryck i många fall kan omvandlas till SQL om dataobjekt stöder det. Se LINQ till SQL .
För de metoder som jämför objekt (som Contains
och Except
) används IEquatable<T>.Equals
om typen T i samlingen implementerar det gränssnittet. Annars standard Equals
och GetHashCode
av typen (möjligen överstyras från standard Object
är implementeringar) används. Det finns också överbelastningar för dessa metoder som gör det möjligt att specificera en anpassad IEqualityComparer<T>
.
För ...OrDefault
metoderna används default(T)
för att generera standardvärden.
Officiell referens: Antalet klass
Lat utvärdering
Praktiskt taget varje fråga som returnerar ett IEnumerable<T>
utvärderas inte omedelbart; istället försenas logiken tills frågan itereras. En implikation är att varje gång någon itererar över ett IEnumerable<T>
skapat från en av dessa frågor, t.ex. .Where()
, upprepas hela frågan logiken. Om predikatet är långvarigt kan det vara en orsak till prestandaproblem.
En enkel lösning (när du vet eller kan kontrollera den ungefärliga storleken på den resulterande sekvensen) är att buffra resultaten med hjälp av .ToArray()
eller .ToList()
. .ToDictionary()
eller .ToLookup()
kan fylla samma roll. Man kan naturligtvis också iterera över hela sekvensen och buffra elementen enligt annan anpassad logik.
ToArray()
eller ToList()
?
Både .ToArray()
och .ToList()
genom alla element i en IEnumerable<T>
-sekvens och sparar resultaten i en samling lagrad i minnet. Använd följande riktlinjer för att avgöra vilka du ska välja:
- Vissa API: er kan kräva en
T[]
eller enList<T>
. -
.ToList()
kör vanligtvis snabbare och genererar mindre skräp än.ToArray()
, eftersom den senare måste kopiera alla element till en ny samling i fast storlek en gång till än den förra, i nästan alla fall. - Element kan läggas till eller tas bort från
List<T>
returneras av..ToList()
, medanT[]
returneras från.ToArray()
förblir en fast storlek under hela sin livstid. Med andra ord,List<T>
är muterbara, ochT[]
är oföränderlig. -
T[]
returneras från.ToArray()
använder mindre minne änList<T>
returneras från.ToList()
, så om resultatet kommer att lagras under lång tid, föredrar du.ToArray()
. SamtalslistaList<T>.TrimExcess()
skulle göra minnesskillnaden strikt akademisk, till bekostnad av att eliminera den relativa hastighetsfördelen med..ToList()
.
Välj (karta)
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
Denna typ av funktion kallas vanligtvis map
på funktionella programmeringsspråk.
Var (filter)
Den här metoden returnerar ett IEantal med alla element som uppfyller lambda-uttrycket
Exempel
var personNames = new[]
{
"Foo", "Bar", "Fizz", "Buzz"
};
var namesStartingWithF = personNames.Where(p => p.StartsWith("F"));
Console.WriteLine(string.Join(",", namesStartingWithF));
Produktion:
Foo, Fizz
Sortera efter
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
innehåller
var numbers = new[] {1,2,3,4,5};
Console.WriteLine(numbers.Contains(3)); //True
Console.WriteLine(numbers.Contains(34)); //False
Bortsett från
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
Korsas
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
Observera att dubletter hålls i resultatet. Om detta är oönskat, använd Union
istället.
Först (hitta)
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
Följande kastar InvalidOperationException
med meddelandet "Sequence innehåller inget matchande element":
var firstNegativeNumber = numbers.First(n => n < 0);
Enda
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
Följande kastar InvalidOperationException
eftersom det finns mer än ett element i sekvensen:
var theOnlyNumberInNumbers = numbers.Single();
var theOnlyNegativeNumber = numbers.Single(n => n < 0);
Sista
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
Följande kastar 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
Följande kastar 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
Några
Returnerar true
om samlingen har några element som uppfyller villkoret i lambda-uttrycket:
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
Allt
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
Observera att All
metoden fungerar genom att kontrollera att det första elementet utvärderas som false
enligt predikatet. Därför kommer metoden returnera true
för alla predikat i det fall att uppsättningen är tom:
var numbers = new int[0];
var allNumbersArePositive = numbers.All(n => n > 0);
Console.WriteLine(allNumbersArePositive); //True
SelectMany (platt karta)
Enumerable.Select
returnerar ett utgångselement för varje ingångselement. Medan Enumerable.SelectMany
producerar ett variabelt antal utgångselement för varje ingångselement. Detta betyder att utgångssekvensen kan innehålla fler eller färre element än vad som fanns i ingångssekvensen.
Lambda expressions
skickas till Enumerable.Select
måste returnera en enda artikel. Lambda-uttryck som skickas till Enumerable.SelectMany
måste producera en barnsekvens. Denna barnsekvens kan innehålla ett varierande antal element för varje element i ingångssekvensen.
Exempel
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()));
Produktion:
1,2,3,4,5,6
Enumerable.SelectMany
kan också uppnås med en syntaxbaserad fråga med två på varandra följande from
klausuler:
var allInvoicesFromAllCustomers
= from customer in customers
from invoice in customer.Invoices
select invoice;
Summa
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
Hoppa
Skip kommer att räkna upp de första N-artiklarna utan att returnera dem. När artikelnummer N + 1 har nåtts, börjar Skip returnera varje uppräknat objekt:
var numbers = new[] {1,2,3,4,5};
var allNumbersExceptFirstTwo = numbers.Skip(2);
Console.WriteLine(string.Join(",", allNumbersExceptFirstTwo.ToArray()));
//3,4,5
Ta
Denna metod tar de första n
elementen från ett antal.
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
Omvänd
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
Medel
var numbers = new[] {1,2,3,4};
var averageNumber = numbers.Average();
Console.WriteLine(averageNumber);
// 2,5
Denna metod beräknar medelvärdet av antalet siffror.
var cities = new[] {
new {Population = 1000},
new {Population = 2000},
new {Population = 4000}
};
var averagePopulation = cities.Average(c => c.Population);
Console.WriteLine(averagePopulation);
// 2333,33
Den här metoden beräknar medelvärdet av en mängd med delegerad funktion.
Blixtlås
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
Distinkt
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
Grupp av
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
Gruppera fakturor per land, genererar ett nytt objekt med antalet poster, totalt betalt och genomsnittligt betalt
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) });
Om vi bara vill ha totalen, ingen grupp
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) });
Om vi behöver flera räkningar
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
Returnerar en ny ordlista från källan IEnumerable
med den medföljande keySelector-funktionen för att bestämma nycklar. Kasta en ArgumentException
om keySelector inte är injicerande (returnerar ett unikt värde för varje medlem i källsamlingen.) Det finns överbelastningar som gör att man kan ange värdet som ska lagras och nyckeln.
var persons = new[] {
new { Name="Fizz", Id=1},
new { Name="Buzz", Id=2},
new { Name="Foo", Id=3},
new { Name="Bar", Id=4},
};
Om du bara Dictionary<TKey,TVal>
skapas en Dictionary<TKey,TVal>
med TKey
Dictionary<TKey,TVal>
, TVal
den ursprungliga objekttypen och det ursprungliga objektet som det lagrade värdet.
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
Dictionary<TKey,TVal>
TKey
skapas en Dictionary<TKey,TVal>
med TKey
fortfarande TKey
, men TVal
nu TVal
och det returnerade värdet som det lagrade värdet.
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
Som nämnts ovan måste knapparna som returneras av tangentväljaren vara unika. Följande kommer att kasta ett undantag.
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)
Om en unik nyckel inte kan ges för källsamlingen, överväg att använda ToLookup istället. På ytan uppträder ToLookup på samma sätt som ToDiction, men i den resulterande sökningen är varje tangent parad med en samling värden med matchande tangenter.
Union
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
Observera att dubletter tas bort från resultatet. Om detta är oönskat, använd Concat
istället.
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[]
Att lista
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
Räkna
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
Aggregera (vika)
Generera ett nytt objekt i varje steg:
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,
Använda samma objekt i alla steg:
var commaSeparatedElements2 = elements.Aggregate(
seed: new StringBuilder(),
func: (seed, element) => seed.Append($"{element},"));
Console.WriteLine(commaSeparatedElements2.ToString()); //1,2,3,4,5,
Med hjälp av en resultatväljare:
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,
Om ett frö utelämnas blir det första elementet fröet:
var seedAndElements = elements.Select(n=>n.ToString());
var commaSeparatedElements4 = seedAndElements.Aggregate(
func: (aggregate, element) => $"{aggregate}{element},");
Console.WriteLine(commaSeparatedElements4); //12,3,4,5,
Att kolla upp
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
Ansluta sig
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
Kasta
Cast
skiljer sig från de andra metoderna i Enumerable
att det är en förlängningsmetod för IEnumerable
, inte för IEnumerable<T>
. Således kan den användas för att konvertera förekomster av de förstnämnda till förekomster av de senare.
Detta sammanställs inte eftersom ArrayList
inte implementerar IEnumerable<T>
:
var numbers = new ArrayList() {1,2,3,4,5};
Console.WriteLine(numbers.First());
Detta fungerar som förväntat:
var numbers = new ArrayList() {1,2,3,4,5};
Console.WriteLine(numbers.Cast<int>().First()); //1
Cast
utför inte konverteringskast. Följande sammanställer men kastar InvalidCastException
vid körning:
var numbers = new int[] {1,2,3,4,5};
decimal[] numbersAsDecimal = numbers.Cast<decimal>().ToArray();
Det rätta sättet att utföra en konverterande roll till en samling är som följer:
var numbers= new int[] {1,2,3,4,5};
decimal[] numbersAsDecimal = numbers.Select(n => (decimal)n).ToArray();
Tömma
Så här skapar du ett tomt IEantal av int:
IEnumerable<int> emptyList = Enumerable.Empty<int>();
Denna tomma IEnumerable är cachelagrad för varje typ T, så att:
Enumerable.Empty<decimal>() == Enumerable.Empty<decimal>(); // This is True
Enumerable.Empty<int>() == Enumerable.Empty<decimal>(); // This is False
ThenBy
ThenBy
kan endast användas efter en OrderBy
klausul som gör det möjligt att beställa med flera kriterier
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
Räckvidd
De två parametrarna för Range
är det första numret och antalet element som ska produceras (inte det sista numret).
// 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)));
Vänster yttre anslutning
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}");
}
Upprepa
Enumerable.Repeat
genererar en sekvens med ett upprepat värde. I detta exempel genererar det "Hej" fyra gånger.
var repeats = Enumerable.Repeat("Hello", 4);
foreach (var item in repeats)
{
Console.WriteLine(item);
}
/* output:
Hello
Hello
Hello
Hello
*/