Szukaj…
Wprowadzenie
LINQ (Language Integrated Query) to wyrażenie, które pobiera dane ze źródła danych. LINQ upraszcza tę sytuację, oferując spójny model pracy z danymi w różnych źródłach i formatach danych. W zapytaniu LINQ zawsze pracujesz z obiektami. Korzystasz z tych samych podstawowych wzorców kodowania, aby wyszukiwać i przekształcać dane w dokumentach XML, bazach danych SQL, zestawach danych ADO.NET, kolekcjach .NET i dowolnym innym formacie, dla którego dostawca jest dostępny. LINQ może być używany w C # i VB.
Składnia
- public static TSource Aggregate <TSource> (to IEnumerable <TSource> źródło, Func <TSource, TSource, TSource> func)
- public static TAccumulate Aggregate <TSource, TAccumulate> (to IEnumerable <TSource> źródło, TAccumulate seed, Func <TAccumulate, TSource, TAccumulate> func)
- public static TResult Aggregate <TSource, TAccumulate, TResult> (to IEnumerable <TSource> źródło, TAccumulate seed, Func <TAccumulate, TSource, TAccumulate> func, Func <TAccumulate, TResult> resultSelector)
- public static Boolean All <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Boolean> predykat)
- public static Boolean Any <TSource> (to IEnumerable <TSource> source)
- public static Boolean Any <TSource> (to IEnumerable <TSource> source, Func <TSource, Boolean> predicate)
- public static IEnumerable <TSource> AsEnumerable <TSource> (to źródło IEnumerable <TSource>)
- public static Decimal Average (to IEnumerable <Decimal> źródło)
- publiczna statyczna podwójna średnia (to IEnumerable <Double> źródło)
- publiczna statyczna podwójna średnia (to IEnumerable <Int32> źródło)
- publiczna statyczna podwójna średnia (to IEnumerable <Int64> źródło)
- public static Nullable <Decimal> Average (to IEnumerable <Nullable <Decimal>> źródło)
- public static Nullable <Double> Average (to IEnumerable <Nullable <Double>> źródło)
- public static Nullable <Double> Average (to IEnumerable <Nullable <Int32>> źródło)
- public static Nullable <Double> Average (to IEnumerable <Nullable <Int64>> źródło)
- public static Nullable <Single> Average (to IEnumerable <Nullable <Single>> źródło)
- public static Single Average (to IEnumerable <Single> źródło)
- public static Decimal Average <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Decimal>)
- public static Double Average <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Double> selektor)
- public static Double Average <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Int32> selektor)
- public static Double Average <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Int64> selektor)
- public static Nullable <Decimal> Average <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Nullable <Decimal>> selektor)
- public static Nullable <Double> Average <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Nullable <Double>>)
- public static Nullable <Double> Average <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Nullable <Int32>> selektor)
- public static Nullable <Double> Average <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Nullable <Int64>>)
- public static Nullable <Single> Average <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Nullable <Single>> selektor)
- public static Single Average <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Single> selektor)
- public static IEnumerable <TResult> Cast <TResult> (to źródło IEnumerable)
- public static IEnumerable <TSource> Concat <TSource> (ten IEnumerable <TSource> pierwszy, IEnumerable <TSource> drugi)
- public static Boolean Zawiera <TSource> (to IEnumerable <TSource> źródło, TSource wartość)
- public static Boolean Zawiera <TSource> (to IEnumerable <TSource> źródło, wartość TSource, IEqualityComparer <TSource> porównywarka)
- public static Int32 Count <TSource> (to IEnumerable <TSource> source)
- public static Int32 Count <TSource> (to IEnumerable <TSource> source, Func <TSource, Boolean> predicate)
- public static IEnumerable <TSource> DefaultIfEmpty <TSource> (to źródło IEnumerable <TSource>
- public static IEnumerable <TSource> DefaultIfEmpty <TSource> (to źródło IEnumerable <TSource>, TSource defaultValue)
- public static IEnumerable <TSource> Distinct <TSource> (to IEnumerable <TSource> źródło)
- public static IEnumerable <TSource> Distinct <TSource> (to IEnumerable <TSource> źródło, IEqualityComparer <TSource> porównywarka)
- public static TSource ElementAt <TSource> (to IEnumerable <TSource> źródło, indeks Int32)
- public static TSource ElementAtOrDefault <TSource> (to IEnumerable <TSource> źródło, indeks Int32)
- public static IEnumerable <TResult> Pusty <TResult> ()
- public static IEnumerable <TSource> Z wyjątkiem <TSource> (ten IEnumerable <TSource> pierwszy, IEnumerable <TSource> drugi)
- public static IEnumerable <TSource> Z wyjątkiem <TSource> (ten IEnumerable <TSource> pierwszy, IEnumerable <TSource> drugi, IEqualityComparer <TSource> porównywarka)
- public static TSource First <TSource> (to IEnumerable <TSource> źródło)
- public static TSource First <TSource> (to IEnumerable <TSource> source, Func <TSource, Boolean> predicate)
- publiczne statyczne TSource FirstOrDefault <TSource> (to IEnumerable <TSource> źródło)
- public static TSource FirstOrDefault <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Boolean> predykat)
- public static IEnumerable <IGrouping <TKey, TSource >> GroupBy <TSource, TKey> (to IEnumerable <TSource> źródło, Func <TSource, TKey> keySelector)
- public static IEnumerable <IGrouping <TKey, TSource >> GroupBy <TSource, TKey> (to IEnumerable <TSource> źródło, Func <TSource, TKey> keySelector, IEqualityComparer <TKey> porównywarka)
- public static IEnumerable <IGrouping <TKey, TElement >> GroupBy <TSource, TKey, TElement> (to IEnumerable <TSource> źródło, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector)
- public static IEnumerable <IGrouping <TKey, TElement >> GroupBy <TSource, TKey, TElement> (ten IEnumerable <TSource> źródło, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector, IEqualityComparer <TKey> porównawczy)
- public static IEnumerable <TResult> GroupBy <TSource, TKey, TResult> (to IEnumerable <TSource> źródło, Func <TSource, TKey> keySelector, Func <TKey, IEnumerable <TSource>, TResult> wynikSelector)
- public static IEnumerable <TResult> GroupBy <TSource, TKey, TResult> (to IEnumerable <TSource> źródło, Func <TSource, TKey> keySelector, Func <TKey, IEnumerable <TSource>, TResult> resultSelector, IEqualityComparer <TKey> porównywarka)
- public static IEnumerable <TResult> GroupBy <TSource, TKey, TElement, TResult> (to IEnumerable <TSource> źródło, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector, Func <TKey, IEnumerable <TElement>, TResult > resultSelector)
- public static IEnumerable <TResult> GroupBy <TSource, TKey, TElement, TResult> (to IEnumerable <TSource> źródło, 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> (ten IEnumerable <TOuter> zewnętrzny, IEnumerable <TInner> wewnętrzny, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> wewnętrznyKeySelector, Func <TOuter, IEnumerable <TInner>, TResult> resultSelector)
- public static IEnumerable <TResult> GroupJoin <TOuter, TInner, TKey, TResult> (ten IEnumerable <TOuter> zewnętrzny, IEnumerable <TInner> wewnętrzny, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> wewnętrznyKeySelector, Func <TOuter, IEnumerable <TInner>, TResult> resultSelector, IEqualityComparer <TKey> Comparer)
- publiczny statyczny IEnumerable <TSource> Przecinaj <TSource> (ten IEnumerable <TSource> pierwszy, IEnumerable <TSource> drugi)
- publiczny statyczny IEnumerable <TSource> Przecięcie <TSource> (ten IEnumerable <TSource> pierwszy, IEnumerable <TSource> drugi, IEqualityComparer <TSource> porównywarka)
- public static IEnumerable <TResult> Dołącz <TOuter, TInner, TKey, TResult> (ten IEnumerable <TOuter> zewnętrzny, IEnumerable <TInner> wewnętrzny, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, TInner, TResult> resultSelector)
- public static IEnumerable <TResult> Dołącz <TOuter, TInner, TKey, TResult> (ten IEnumerable <TOuter> zewnętrzny, IEnumerable <TInner> wewnętrzny, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, TInner, TResult> resultSelector, IEqualityComparer <TKey> Comparer)
- public static TSource Last <TSource> (to IEnumerable <TSource> źródło)
- public static TSource Last <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Boolean> predykat)
- public static TSource LastOrDefault <TSource> (to IEnumerable <TSource> źródło)
- public static TSource LastOrDefault <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Boolean> predykat)
- public static Int64 LongCount <TSource> (to IEnumerable <TSource> źródło)
- public static Int64 LongCount <TSource> (to IEnumerable <TSource> source, Func <TSource, Boolean> predicate)
- public static Decimal Max (to IEnumerable <Decimal> źródło)
- public static Double Max (to IEnumerable <Double> źródło)
- public static Int32 Max (to IEnumerable <Int32> źródło)
- public static Int64 Max (to IEnumerable <Int64> źródło)
- public static Nullable <Decimal> Max (to IEnumerable <Nullable <Decimal>> źródło)
- public static Nullable <Double> Max (to IEnumerable <Nullable <Double>> źródło)
- public static Nullable <Int32> Max (to IEnumerable <Nullable <Int32>> źródło)
- public static Nullable <Int64> Max (to IEnumerable <Nullable <Int64>> źródło)
- public static Nullable <Single> Max (to IEnumerable <Nullable <Single>> źródło)
- public static Single Max (to IEnumerable <Single> źródło)
- public static TSource Max <TSource> (to IEnumerable <TSource> źródło)
- public static Decimal Max <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Decimal>)
- public static Double Max <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Double> selektor)
- public static Int32 Max <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Int32> selektor)
- public static Int64 Max <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Int64> selektor)
- public static Nullable <Decimal> Max <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Nullable <Decimal>> selektor)
- public static Nullable <Double> Max <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Nullable <Double>>)
- public static Nullable <Int32> Max <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Nullable <Int32>> selektor)
- public static Nullable <Int64> Max <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Nullable <Int64>> selektor)
- public static Nullable <Single> Max <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Nullable <Single>> selektor)
- public static Single Max <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Single> selektor)
- public static TResult Max <TSource, TResult> (ten IEnumerable <TSource> źródło, Func <TSource, TResult> selektor)
- public static Decimal Min (to IEnumerable <Decimal> źródło)
- public static Double Min (to IEnumerable <Double> źródło)
- public static Int32 Min (to IEnumerable <Int32> źródło)
- public static Int64 Min (to IEnumerable <Int64> źródło)
- public static Nullable <Decimal> Min (to IEnumerable <Nullable <Decimal>> źródło)
- public static Nullable <Double> Min (to IEnumerable <Nullable <Double>> źródło)
- public static Nullable <Int32> Min (to IEnumerable <Nullable <Int32>> źródło)
- public static Nullable <Int64> Min (to IEnumerable <Nullable <Int64>> źródło)
- public static Nullable <Single> Min (to IEnumerable <Nullable <Single>> źródło)
- public static Single Min (to IEnumerable <Single> źródło)
- public static TSource Min <TSource> (to IEnumerable <TSource> źródło)
- public static Decimal Min <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Decimal>)
- public static Double Min <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Double> selektor)
- public static Int32 Min <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Int32> selektor)
- public static Int64 Min <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Int64> selektor)
- public static Nullable <Decimal> Min <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Nullable <Decimal>> selektor)
- public static Nullable <Double> Min <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Nullable <Double>>)
- public static Nullable <Int32> Min <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Nullable <Int32>> selektor)
- public static Nullable <Int64> Min <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Nullable <Int64>> selektor)
- public static Nullable <Single> Min <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Nullable <Single>> selektor)
- public static Single Min <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Single> selektor)
- public static TResult Min <TSource, TResult> (ten IEnumerable <TSource> źródło, Func <TSource, TResult> selektor)
- public static IEnumerable <TResult> OfType <TResult> (to źródło IEnumerable)
- public static IOrdersEnumerable <TSource> OrderBy <TSource, TKey> (to IEnumerable <TSource> źródło, Func <TSource, TKey> keySelector)
- public static IOrdersEnumerable <TSource> OrderBy <TSource, TKey> (to IEnumerable <TSource> źródło, Func <TSource, TKey> keySelector, IComparer <TKey> moduł porównujący)
- public static IOrdersEnumerable <TSource> OrderByDescending <TSource, TKey> (to IEnumerable <TSource> źródło, Func <TSource, TKey> keySelector)
- public static IOrdersEnumerable <TSource> OrderByDescending <TSource, TKey> (to IEnumerable <TSource> źródło, Func <TSource, TKey> keySelector, IComparer <TKey> porównywarka)
- public static IEnumerable <Int32> Range (Int32 start, Int32 count)
- public static IEnumerable <TResult> Powtórz <TResult> (element TResult, liczba Int32)
- public static IEnumerable <TSource> Reverse <TSource> (to IEnumerable <TSource> źródło)
- public static IEnumerable <TResult> Wybierz <TSource, TResult> (ten IEnumerable <TSource> źródło, Func <TSource, TResult>)
- public static IEnumerable <TResult> Wybierz <TSource, TResult> (ten IEnumerable <TSource> źródło, Func <TSource, Int32, TResult>)
- public static IEnumerable <TResult> SelectMany <TSource, TResult> (to źródło IEnumerable <TSource>, Func <TSource, IEnumerable <TResult>> selektor)
- publiczny statyczny IEnumerable <TResult> SelectMany <TSource, TResult> (ten IEnumerable <TSource> źródło, Func <TSource, Int32, IEnumerable <TResult>> selektor)
- public static IEnumerable <TResult> SelectMany <TSource, TCollection, TResult> (to IEnumerable <TSource> źródło, Func <TSource, IEnumerable <TCollection>> collectionSelector, Func <TSource, TCollection, TResult> scoreSelector
- public static IEnumerable <TResult> SelectMany <TSource, TCollection, TResult> (to IEnumerable <TSource> źródło, Func <TSource, Int32, IEnumerable <TCollection>> collectionSelector, Func <TSource, TCollection, TResult> resultSelector
- public static Boolean SequenceEqual <TSource> (ten IEnumerable <TSource> pierwszy, IEnumerable <TSource> drugi)
- public static Boolean SequenceEqual <TSource> (ten IEnumerable <TSource> pierwszy, IEnumerable <TSource> drugi, IEqualityComparer <TSource> porównywarka)
- publiczny statyczny TSource Single <TSource> (to IEnumerable <TSource> źródło)
- public static TSource Single <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Boolean> predykat)
- public static TSource SingleOrDefault <TSource> (to IEnumerable <TSource> źródło)
- public static TSource SingleOrDefault <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Boolean> predykat)
- public static IEnumerable <TSource> Skip <TSource> (to IEnumerable <TSource> source, Int32 count)
- public static IEnumerable <TSource> SkipWhile <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Boolean> predykat)
- public static IEnumerable <TSource> SkipWhile <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Int32, Boolean> predykat)
- public static Decimal Sum (to IEnumerable <Decimal> źródło)
- public static Double Sum (to IEnumerable <Double> źródło)
- publiczna statyczna suma Int32 (to IEnumerable <Int32> źródło)
- publiczna statyczna suma Int64 (to IEnumerable <Int64> źródło)
- public static Nullable <Decimal> Sum (this IEnumerable <Nullable <Decimal>> source)
- public static Nullable <Double> Sum (this IEnumerable <Nullable <Double>> source)
- public static static Nullable <Int32> Sum (this IEnumerable <Nullable <Int32>> source)
- public static static Nullable <Int64> Sum (this IEnumerable <Nullable <Int64>> source)
- public static Nullable <Single> Sum (to IEnumerable <Nullable <Single>> źródło)
- public static Single Sum (to IEnumerable <Single> źródło)
- public static Decimal Sum <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Decimal>)
- public static Double Sum <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Double> selektor)
- public static Int32 Sum <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Int32> selektor)
- public static Int64 Sum <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Int64> selektor)
- public static Nullable <Decimal> Sum <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Nullable <Decimal>> selektor)
- public static Nullable <Double> Sum <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Nullable <Double>>)
- public static Nullable <Int32> Sum <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Nullable <Int32>> selektor)
- public static Nullable <Int64> Sum <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Nullable <Int64>> selektor)
- public static Nullable <Single> Sum <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Nullable <Single>> selektor)
- public static Single Sum <TSource> (ten IEnumerable <TSource> źródło, Func <TSource, Single> selektor)
- public static IEnumerable <TSource> Weź <TSource> (to IEnumerable <TSource> źródło, liczba Int32)
- public static IEnumerable <TSource> TakeWhile <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Boolean> predykat)
- public static IEnumerable <TSource> TakeWhile <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Int32, Boolean> predykat)
- public static IOrdersEnumerable <TSource> ThenBy <TSource, TKey> (to źródło IOrdersEnumerable <TSource>, Func <TSource, TKey> keySelector)
- public static IOrdersEnumerable <TSource> ThenBy <TSource, TKey> (to IOrdersEnumerable <TSource> źródło, Func <TSource, TKey> keySelector, IComparer <TKey> porównujący)
- public static IOrdersEnumerable <TSource> ThenByDescending <TSource, TKey> (to IOrdersEnumerable <TSource> źródło, Func <TSource, TKey> keySelector)
- public static IOrdersEnumerable <TSource> ThenByDescending <TSource, TKey> (to IOrdersEnumerable <TSource> źródło, Func <TSource, TKey> keySelector, IComparer <TKey> moduł porównujący)
- public static TSource [] ToArray <TSource> (to IEnumerable <TSource> źródło)
- publiczny słownik statyczny <TKey, TSource> ToDictionary <TSource, TKey> (to IEnumerable <TSource> źródło, Func <TSource, TKey> keySelector)
- publiczny słownik statyczny <TKey, TSource> ToDictionary <TSource, TKey> (to IEnumerable <TSource> źródło, Func <TSource, TKey> keySelector, IEqualityComparer <TKey> porównywarka)
- publiczny słownik statyczny <TKey, TElement> ToDictionary <TSource, TKey, TElement> (to IEnumerable <TSource> źródło, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector)
- publiczny słownik statyczny <TKey, TElement> ToDictionary <TSource, TKey, TElement> (to IEnumerable <TSource> źródło, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector, IEqualityComparer <TKey> porównawczy)
- public static List <TSource> ToList <TSource> (to IEnumerable <TSource> źródło)
- publiczny statyczny ILookup <TKey, TSource> ToLookup <TSource, TKey> (to IEnumerable <TSource> źródło, Func <TSource, TKey> keySelector)
- publiczny statyczny ILookup <TKey, TSource> ToLookup <TSource, TKey> (to IEnumerable <TSource> źródło, Func <TSource, TKey> keySelector, IEqualityComparer <TKey> porównaj)
- publiczne statyczne ILookup <TKey, TElement> ToLookup <TSource, TKey, TElement> (to IEnumerable <TSource> źródło, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector)
- public static ILookup <TKey, TElement> ToLookup <TSource, TKey, TElement> (to IEnumerable <TSource> źródło, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector, IEqualityComparer <TKey> porównawczy)
- publiczny statyczny IEnumerable <TSource> Union <TSource> (ten IEnumerable <TSource> pierwszy, IEnumerable <TSource> drugi)
- publiczny statyczny IEnumerable <TSource> Union <TSource> (ten IEnumerable <TSource> pierwszy, IEnumerable <TSource> drugi, IEqualityComparer <TSource> porównywarka)
- public static IEnumerable <TSource> Where <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Boolean> predicate)
- public static IEnumerable <TSource> Where <TSource> (to IEnumerable <TSource> źródło, Func <TSource, Int32, Boolean> predykat)
- public static IEnumerable <TResult> Zip <TFirst, TSecond, TResult> (ten IEnumerable <TFirst> pierwszy, IEnumerable <TSecond> drugi, Func <TFirst, TSecond, TResult> wynikSelector)
Uwagi
- Zobacz także LINQ .
Wbudowane metody LINQ są metodami rozszerzenia interfejsu IEnumerable<T>
, które istnieją w klasie System.Linq.Enumerable
w zestawie System.Core
. Są one dostępne w .NET Framework 3.5 i nowszych.
LINQ pozwala na prostą modyfikację, transformację i kombinację różnych IEnumerable
przy użyciu składni podobnej do zapytania lub funkcjonalnej.
Chociaż standardowe metody LINQ mogą działać na dowolnym IEnumerable<T>
, w tym na prostych tablicach i List<T>
, mogą być również używane na obiektach bazy danych, w których zestaw wyrażeń LINQ można w wielu przypadkach przekształcić na SQL, jeśli obiekt danych obsługuje to. Zobacz LINQ to SQL .
W przypadku metod, które porównują obiekty (takie jak Contains
i Except
), IEquatable<T>.Equals
jest używany, jeśli typ T kolekcji implementuje ten interfejs. W przeciwnym razie stosowane są standardowe typy Equals
i GetHashCode
(ewentualnie zastąpione z domyślnych implementacji Object
). Istnieją również przeciążenia dla tych metod, które pozwalają określić niestandardowy IEqualityComparer<T>
.
W przypadku metod ...OrDefault
do generowania wartości domyślnych używana jest default(T)
.
Oficjalne odniesienie: klasa wymienna
Leniwa ocena
Praktycznie każde zapytanie zwracające IEnumerable<T>
nie jest oceniane natychmiast; zamiast tego logika jest opóźniona do momentu iteracji zapytania. Jedną z implikacji jest to, że za każdym razem, gdy ktoś iteruje w IEnumerable<T>
utworzonym z jednego z tych zapytań, np. .Where()
, logika pełnego zapytania jest powtarzana. Jeśli predykat jest długotrwały, może to być przyczyną problemów z wydajnością.
Jednym prostym rozwiązaniem (gdy znasz lub możesz kontrolować przybliżony rozmiar wynikowej sekwencji) jest pełne buforowanie wyników za pomocą .ToArray()
lub .ToList()
. .ToDictionary()
lub .ToLookup()
mogą spełniać tę samą rolę. Oczywiście można również iterować całą sekwencję i buforować elementy zgodnie z inną niestandardową logiką.
ToArray()
czy ToList()
?
Zarówno .ToArray()
i .ToList()
przechodzą przez wszystkie elementy IEnumerable<T>
sekwencji IEnumerable<T>
i zapisują wyniki w kolekcji przechowywanej w pamięci. Skorzystaj z następujących wskazówek, aby określić, który wybrać:
- Niektóre interfejsy API mogą wymagać
T[]
lubList<T>
. -
.ToList()
zazwyczaj działa szybciej i generuje mniej śmieci niż.ToArray()
, ponieważ ten ostatni musi skopiować wszystkie elementy do nowej kolekcji o stałym rozmiarze raz więcej niż poprzedni, prawie w każdym przypadku. - Elementy mogą być dodawane lub usuwane z
List<T>
zwracanej przez.ToList()
, podczas gdyT[]
zwracany z.ToArray()
pozostaje przez cały czas ustalony rozmiar. Innymi słowy,List<T>
jest zmienna, aT[]
jest niezmienny. -
T[]
zwrócony z.ToArray()
zużywa mniej pamięci niżList<T>
zwrócona z.ToList()
, więc jeśli wynik ma być przechowywany przez długi czas, wybierz.ToArray()
. WywołanieList<T>.TrimExcess()
spowodowałoby, że różnica w pamięci byłaby ściśle akademicka, kosztem wyeliminowania przewagi prędkości względnej.ToList()
.
Wybierz (mapa)
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
Ten typ funkcji jest zwykle nazywany map
w funkcjonalnych językach programowania.
Gdzie (filtr)
Ta metoda zwraca IEnumerable ze wszystkimi elementami, które spełniają wyrażenie lambda
Przykład
var personNames = new[]
{
"Foo", "Bar", "Fizz", "Buzz"
};
var namesStartingWithF = personNames.Where(p => p.StartsWith("F"));
Console.WriteLine(string.Join(",", namesStartingWithF));
Wynik:
Foo, Fizz
Zamów przez
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
Zawiera
var numbers = new[] {1,2,3,4,5};
Console.WriteLine(numbers.Contains(3)); //True
Console.WriteLine(numbers.Contains(34)); //False
Z wyjątkiem
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
Krzyżować
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
Zauważ, że w wyniku są przechowywane duplikaty. Jeśli jest to niepożądane, użyj Union
zamiast tego.
Pierwszy (znajdź)
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
Następujący wyrzuca InvalidOperationException
z komunikatem „Sekwencja nie zawiera pasującego elementu”:
var firstNegativeNumber = numbers.First(n => n < 0);
Pojedynczy
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
Poniższe zgłasza InvalidOperationException
ponieważ w sekwencji jest więcej niż jeden element:
var theOnlyNumberInNumbers = numbers.Single();
var theOnlyNegativeNumber = numbers.Single(n => n < 0);
Ostatni, ubiegły, zeszły
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
Poniższe zgłasza 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
Poniższe zgłasza 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
Każdy
Zwraca wartość true
jeśli kolekcja zawiera elementy spełniające warunek wyrażenia lambda:
var numbers = new[] {1,2,3,4,5};
var isNotEmpty = numbers.Any();
Console.WriteLine(isNotEmpty); //True
var anyNumberIsOne = numbers.Any(n => n == 1);
Console.WriteLine(anyNumberIsOne); //True
var anyNumberIsSix = numbers.Any(n => n == 6);
Console.WriteLine(anyNumberIsSix); //False
var anyNumberIsOdd = numbers.Any(n => (n & 1) == 1);
Console.WriteLine(anyNumberIsOdd); //True
var anyNumberIsNegative = numbers.Any(n => n < 0);
Console.WriteLine(anyNumberIsNegative); //False
Wszystko
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
Zauważ, że metoda All
działa, sprawdzając, czy pierwszy element ma wartość false
zgodnie z predykatem. Dlatego metoda zwróci true
dla każdego predykatu w przypadku, gdy zestaw jest pusty:
var numbers = new int[0];
var allNumbersArePositive = numbers.All(n => n > 0);
Console.WriteLine(allNumbersArePositive); //True
SelectMany (płaska mapa)
Enumerable.Select
zwraca element wyjściowy dla każdego elementu wejściowego. Natomiast Enumerable.SelectMany
produkuje zmienną liczbę elementów wyjściowych dla każdego elementu wejściowego. Oznacza to, że sekwencja wyjściowa może zawierać więcej lub mniej elementów niż w sekwencji wejściowej.
Lambda expressions
przekazane do Enumerable.Select
musi zwrócić pojedynczy element. Wyrażenia lambda przekazane do Enumerable.SelectMany
muszą wytworzyć sekwencję Enumerable.SelectMany
. Ta sekwencja potomna może zawierać zmienną liczbę elementów dla każdego elementu w sekwencji wejściowej.
Przykład
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()));
Wynik:
1,2,3,4,5,6
Enumerable.SelectMany
można również osiągnąć za pomocą zapytania opartego na składni, używając dwóch następujących from
klauzul:
var allInvoicesFromAllCustomers
= from customer in customers
from invoice in customer.Invoices
select invoice;
Suma
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
Pominąć
Skip wyliczy pierwsze N elementów bez ich zwracania. Po osiągnięciu numeru pozycji N + 1 Skip zaczyna zwracać każdy wyliczony przedmiot:
var numbers = new[] {1,2,3,4,5};
var allNumbersExceptFirstTwo = numbers.Skip(2);
Console.WriteLine(string.Join(",", allNumbersExceptFirstTwo.ToArray()));
//3,4,5
Brać
Ta metoda bierze pierwsze n
elementów z wyliczalnego.
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
Rewers
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
Średni
var numbers = new[] {1,2,3,4};
var averageNumber = numbers.Average();
Console.WriteLine(averageNumber);
// 2,5
Ta metoda oblicza średnią liczbową liczb.
var cities = new[] {
new {Population = 1000},
new {Population = 2000},
new {Population = 4000}
};
var averagePopulation = cities.Average(c => c.Population);
Console.WriteLine(averagePopulation);
// 2333,33
Ta metoda oblicza średnią wyliczenia za pomocą funkcji delegowanej.
Zamek błyskawiczny
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
Odrębny
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
Grupuj według
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
Grupuj faktury według kraju, generując nowy obiekt z liczbą rekordów, sumą zapłaconą i średnią zapłaconą
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) });
Jeśli chcemy tylko sumy, nie ma grupy
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) });
Jeśli potrzebujemy kilku obliczeń
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
Zwraca nowy słownik ze źródłowej IEnumerable
za pomocą dostarczonej funkcji keySelector w celu ustalenia kluczy. Zgłasza ArgumentException
jeśli keySelector nie jest iniekcyjny (zwraca unikalną wartość dla każdego elementu kolekcji źródłowej). Istnieją przeciążenia, które pozwalają określić wartość, która ma być przechowywana, a także klucz.
var persons = new[] {
new { Name="Fizz", Id=1},
new { Name="Buzz", Id=2},
new { Name="Foo", Id=3},
new { Name="Bar", Id=4},
};
Podanie tylko funkcji wyboru klucza spowoduje utworzenie Dictionary<TKey,TVal>
pomocą TKey
zwracany typ selektora klucza, TVal
oryginalny typ obiektu i obiekt oryginalny jako wartość przechowywana.
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
Podanie również funkcji wyboru wartości spowoduje utworzenie Dictionary<TKey,TVal>
z TKey
nadal typem zwrotnym selektora klawiszy, ale TVal
teraz typem zwrotnym funkcji selektora wartości i zwróconą wartością jako zapamiętaną wartością.
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
Jak wspomniano powyżej, klucze zwrócone przez selektor kluczy muszą być unikalne. Poniższe spowoduje zgłoszenie wyjątku.
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)
Jeśli nie można podać unikalnego klucza dla kolekcji źródłowej, rozważ użycie ToLookup zamiast tego. Na powierzchni ToLookup zachowuje się podobnie jak ToDictionary, jednak w wynikowym odnośniku każdy klucz jest sparowany z kolekcją wartości z pasującymi kluczami.
Unia
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
Pamiętaj, że duplikaty są usuwane z wyniku. Jeśli jest to niepożądane, zamiast tego użyj Concat
.
ToArray
var numbers = new[] {1,2,3,4,5,6,7,8,9,10};
var someNumbers = numbers.Where(n => n < 6);
Console.WriteLine(someNumbers.GetType().Name);
//WhereArrayIterator`1
var someNumbersArray = someNumbers.ToArray();
Console.WriteLine(someNumbersArray.GetType().Name);
//Int32[]
Notować
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
Liczyć
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
Kruszywo (krotnie)
Generowanie nowego obiektu na każdym kroku:
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,
Używanie tego samego obiektu we wszystkich krokach:
var commaSeparatedElements2 = elements.Aggregate(
seed: new StringBuilder(),
func: (seed, element) => seed.Append($"{element},"));
Console.WriteLine(commaSeparatedElements2.ToString()); //1,2,3,4,5,
Za pomocą selektora wyników:
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,
Jeśli ziarno zostanie pominięte, pierwszy element staje się ziarnem:
var seedAndElements = elements.Select(n=>n.ToString());
var commaSeparatedElements4 = seedAndElements.Aggregate(
func: (aggregate, element) => $"{aggregate}{element},");
Console.WriteLine(commaSeparatedElements4); //12,3,4,5,
ToLookup
var persons = new[] {
new { Name="Fizz", Job="Developer"},
new { Name="Buzz", Job="Developer"},
new { Name="Foo", Job="Astronaut"},
new { Name="Bar", Job="Astronaut"},
};
var groupedByJob = persons.ToLookup(p => p.Job);
foreach(var theGroup in groupedByJob)
{
Console.WriteLine(
"{0} are {1}s",
string.Join(",", theGroup.Select(g => g.Name).ToArray()),
theGroup.Key);
}
//Fizz,Buzz are Developers
//Foo,Bar are Astronauts
Przystąp
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
Odlew
Cast
różni się od innych metod Enumerable
na tym, że jest to metoda rozszerzenie dla IEnumerable
, nie dla IEnumerable<T>
. W ten sposób można go wykorzystać do konwersji wystąpień tego pierwszego na wystąpienie późniejszego.
Nie kompiluje się, ponieważ ArrayList
nie implementuje IEnumerable<T>
:
var numbers = new ArrayList() {1,2,3,4,5};
Console.WriteLine(numbers.First());
Działa to zgodnie z oczekiwaniami:
var numbers = new ArrayList() {1,2,3,4,5};
Console.WriteLine(numbers.Cast<int>().First()); //1
Cast
nie wykonuje rzutów konwersji. Następujące kompiluje, ale zgłasza InvalidCastException
w czasie wykonywania:
var numbers = new int[] {1,2,3,4,5};
decimal[] numbersAsDecimal = numbers.Cast<decimal>().ToArray();
Właściwy sposób przeprowadzenia konwersji rzutowania na kolekcję jest następujący:
var numbers= new int[] {1,2,3,4,5};
decimal[] numbersAsDecimal = numbers.Select(n => (decimal)n).ToArray();
Pusty
Aby utworzyć pusty IEnumerable int:
IEnumerable<int> emptyList = Enumerable.Empty<int>();
Ten pusty IEnumerable jest buforowany dla każdego typu T, dzięki czemu:
Enumerable.Empty<decimal>() == Enumerable.Empty<decimal>(); // This is True
Enumerable.Empty<int>() == Enumerable.Empty<decimal>(); // This is False
Więc przez
ThenBy
można użyć tylko po klauzuli OrderBy
pozwalającej na zamówienie przy użyciu wielu kryteriów
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
Zasięg
Dwa parametry do Range
to pierwsza liczba i liczba elementów do wyprodukowania (nie ostatnia liczba).
// 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)));
Lewy zewnętrzny łącznik
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}");
}
Powtarzać
Enumerable.Repeat
generuje sekwencję powtarzanej wartości. W tym przykładzie generuje „Cześć” 4 razy.
var repeats = Enumerable.Repeat("Hello", 4);
foreach (var item in repeats)
{
Console.WriteLine(item);
}
/* output:
Hello
Hello
Hello
Hello
*/