Recherche…
Introduction
LINQ (Language Integrated Query) est une expression qui extrait des données d'une source de données. LINQ simplifie cette situation en proposant un modèle cohérent pour travailler avec des données sur différents types de sources de données et de formats. Dans une requête LINQ, vous travaillez toujours avec des objets. Vous utilisez les mêmes modèles de codage de base pour interroger et transformer des données dans des documents XML, des bases de données SQL, des ensembles de données ADO.NET, des collections .NET et tout autre format pour lequel un fournisseur est disponible. LINQ peut être utilisé en C # et VB.
Syntaxe
- statique statique TSource Aggregate <TSource> (cette source IEnumerable <TSource>, Func <TSource, TSource, TSource> func)
- statique statique TAccumulate Aggregate <TSource, TAccumulate> (cette source IEnumerable <TSource>, graine TAccumulate, Func <TAccumulate, TSource, TAccumulate> func)
- statique statique TResult Aggregate <TSource, TAccumulate, TResult> (cette source IEnumerable <TSource>, graine TAccumulate, Func <TAccumulate, TSource, TAccumulate> func, Func <TAccumulate, TResult> resultSelector)
- public statique Booléen Tous <TSource> (cet attribut IEnumerable <TSource> source, Func <TSource, Boolean>)
- Booléen statique public Tout <TSource> (cette source IEnumerable <TSource>)
- booléen statique public Tout <TSource> (cet attribut IEnumerable <TSource> source, Func <TSource, Boolean>)
- public statique IEnumerable <TSource> AsEnumerable <TSource> (cette source IEnumerable <TSource>)
- Moyenne décimale statique publique (cette source IEnumerable <Decimal>)
- Double statique statique publique (cette source IEnumerable <Double>)
- Double statique statique publique (cette source IEnumerable <Int32>)
- public static Double Average (cette source IEnumerable <Int64>)
- public statique Nullable Moyenne <Decimal> (cette source IEnumerable <Nullable <Decimal >>)
- public statique Nullable <Double> Average (cette source IEnumerable <Nullable <Double >>)
- public statique Nullable <Double> Average (cette source IEnumerable <Nullable <Int32 >>)
- public statique Nullable <Double> Average (cette source IEnumerable <Nullable <Int64 >>)
- public statique Nullable <Single> Average (cette source IEnumerable <Nullable <Single >>)
- Public Single Single Average (cette source IEnumerable <Single>)
- Moyenne décimale statique publique <TSource> (ce sélecteur IEnumerable <TSource>, Func <TSource, Decimal>)
- statique publique Double Moyenne <TSource> (cette source IEnumerable <TSource>, Func <TSource, Double> sélecteur)
- statique publique Double Moyenne <TSource> (cette source IEnumerable <TSource>, Func <TSource, Int32> sélecteur)
- double statique public <TSource> (cette source IEnumerable <TSource>, Func <TSource, Int64> sélecteur)
- public statique Nullable <Decimal> Average <TSource> (ce sélecteur IEnumerable <TSource>, Func <TSource, Nullable <Decimal >>)
- public statique Nullable <Double> Moyenne <TSource> (cette source IEnumerable <TSource>, Func <TSource, Sélecteur <Double >>)
- public statique Nullable <Double> Moyenne <TSource> (cette source IEnumerable <TSource>, Func <TSource, Nullable <Int32 >>)
- public statique Nullable <Double> Moyenne <TSource> (cette source IEnumerable <TSource>, Func <TSource, Nullable <Int64 >>)
- public static Nullable <Single> Average <TSource> (cette source IEnumerable <TSource>, Func <TSource, Nullable <Single >>)
- public statique Single Average <TSource> (cette source IEnumerable <TSource>, Func <TSource, Single> sélecteur)
- public statique IEnumerable <TResult> Cast <TResult> (cette source IEnumerable)
- public statique IEnumerable <TSource> Concat <TSource> (ceci IEnumerable <TSource> d'abord, IEnumerable <TSource> second)
- Booléen statique public Contient <TSource> (cette source IEnumerable <TSource>, valeur TSource)
- Boolean statique public Contient <TSource> (cette source IEnumerable <TSource>, valeur TSource, IEqualityComparer <TSource> comparer)
- statique statique Int32 Count <TSource> (cette source IEnumerable <TSource>)
- statique public Int32 Count <TSource> (cet attribut IEnumerable <TSource> source, Func <TSource, Boolean>)
- public statique IEnumerable <TSource> DefaultIfEmpty <TSource> (cette source IEnumerable <TSource>)
- public statique IEnumerable <TSource> DefaultIfEmpty <TSource> (cette source IEnumerable <TSource>, TSource defaultValue)
- statique publique IEnumerable <TSource> Distinct <TSource> (cette source IEnumerable <TSource>)
- public statique IEnumerable <TSource> Distinct <TSource> (cette source IEnumerable <TSource>, IEqualityComparer <TSource> comparer)
- Élément TSource statique public <TSource> (cette source IEnumerable <TSource>, index Int32)
- statique publique TSource ElementAtOrDefault <TSource> (cette source IEnumerable <TSource>, index Int32)
- public static IEnumerable <TResult> Vide <TResult> ()
- public static IEnumerable <TSource> Sauf <TSource> (ceci IEnumerable <TSource> d'abord, IEnumerable <TSource> second)
- public static IEnumerable <TSource> Sauf <TSource> (ceci IEnumerable <TSource> d'abord, IEnumerable <TSource> second, IEqualityComparer <TSource> comparer)
- statique publique TSource First <TSource> (cette source IEnumerable <TSource>)
- public statique TSource First <TSource> (ce prédicat IEnumerable <TSource>, Func <TSource, Boolean>)
- statique publique TSource FirstOrDefault <TSource> (cette source IEnumerable <TSource>)
- statique publique TSource FirstOrDefault <TSource> (ce prédicat IEnumerable <TSource>, Func <TSource, Boolean>)
- public static IEnumerable <IGrouping <TKey, TSource >> GroupBy <TSource, TKey> (cette source IEnumerable <TSource>, Func <TSource, TKey> keySelector)
- public static IEnumerable <IGrouping <TKey, TSource >> GroupBy <TSource, TKey> (cette source IEnumerable <TSource>, Func <TSource, TKey> cléSelector, IEqualityComparer <TKey> comparer
- public static IEnumerable <IGrouping <TKey, TElement >> GroupBy <TSource, TKey, TElement> (cette source IEnumerable <TSource>, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector)
- public static IEnumerable <IGrouping <TKey, TElement >> GroupBy <TSource, TKey, TElement> (cette source IEnumerable <TSource>, Func <TSource, TKey> sélecteur de clés, Func <TSource, TElement> elementSelector, IEqualityComparer <TKey> comparer
- public statique IEnumerable <TResult> GroupBy <TSource, TKey, TResult> (cette source IEnumerable <TSource>, Func <TSource, TKey> keySelector, Func <TKey, IEnumerable <TSource>, TResult> resultSelector)
- public statique IEnumerable <TResult> GroupBy <TSource, TKey, TResult> (cette source IEnumerable <TSource>, Func <TSource, TKey> KeySelector, Func <TKey, IEnumerable <TSource>, TResult> resultSelector, IEqualityComparer <TKey> comparer
- public statique IEnumerable <TResult> GroupBy <TSource, TKey, TElement, TResult> (cette source IEnumerable <TSource>, Func <TSource, TKey> sélecteur de clés, Func <TSource, TElement> elementSelector, Func <TKey, IEnumerable <TElement>, TResult > resultSelector)
- public statique IEnumerable <TResult> GroupBy <TSource, TKey, TElement, TResult> (cette source IEnumerable <TSource>, Func <TSource, TKey> sélecteur de clés, Func <TSource, TElement> elementSelector, Func <TKey, IEnumerable <TElement>, TResult > resultSelector, IEqualityComparer <TKey> comparer
- public statique IEnumerable <TResult> GroupJoin <TOuter, TInner, TKey, TResult> (this externe IEnumerable <TOuter>, IEnumerable <TInner> inner, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, IEnumerable <TInner>, TResult> resultSelector)
- public statique IEnumerable <TResult> GroupJoin <TOuter, TInner, TKey, TResult> (this externe IEnumerable <TOuter>, IEnumerable <TInner> inner, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, IEnumerable <TInner>, TResult> resultSelector, IEqualityComparer <TKey> comparer
- public statique IEnumerable <TSource> Intersect <TSource> (ceci IEnumerable <TSource> d'abord, IEnumerable <TSource> second)
- public statique IEnumerable <TSource> Intersect <TSource> (ce IEnumerable <TSource> en premier, IEnumerable <TSource> second, IEqualityComparer <TSource> comparer)
- public static IEnumerable <TResult> Join <TOuter, TInner, TKey, TResult> (this externe IEnumerable <TOuter>, IEnumerable <TInner> inner, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, TInner, TResult> resultSelector)
- public static IEnumerable <TResult> Join <TOuter, TInner, TKey, TResult> (this externe IEnumerable <TOuter>, IEnumerable <TInner> inner, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, TInner, TResult> resultSelector, IEqualityComparer <TKey> comparer
- statique publique TSource Last <TSource> (cette source IEnumerable <TSource>)
- TSource statique public Last <TSource> (cet attribut IEnumerable <TSource> source, Func <TSource, Boolean>)
- statique publique TSource LastOrDefault <TSource> (cette source IEnumerable <TSource>)
- statique publique TSource LastOrDefault <TSource> (ce prédicat IEnumerable <TSource>, Func <TSource, Boolean>)
- public statique Int64 LongCount <TSource> (cette source IEnumerable <TSource>)
- public statique Int64 LongCount <TSource> (ce prédicat IEnumerable <TSource>, Func <TSource, Boolean>)
- public decimal max statique (cette source IEnumerable <Decimal>)
- statique publique Double Max (cette source IEnumerable <Double>)
- public statique Int32 Max (cette source IEnumerable <Int32>)
- public statique Int64 Max (cette source IEnumerable <Int64>)
- public static Nullable <Decimal> Max (cette source IEnumerable <Nullable <Decimal >>)
- public static Nullable <Double> Max (cette source IEnumerable <Nullable <Double >>)
- public static Nullable <Int32> Max (cette source IEnumerable <Nullable <Int32 >>)
- public static Nullable <Int64> Max (cette source IEnumerable <Nullable <Int64 >>)
- public static Nullable <Single> Max (cette source IEnumerable <Nullable <Single >>)
- statique publique Single Max (cette source IEnumerable <Single>)
- statique publique TSource Max <TSource> (cette source IEnumerable <TSource>)
- décimal statique public Max <TSource> (ce sélecteur IEnumerable <TSource>, Func <TSource, Decimal>)
- statique publique Double Max <TSource> (cette source IEnumerable <TSource>, Func <TSource, Double> sélecteur)
- public static Int32 Max <TSource> (ce sélecteur IEnumerable <TSource>, Func <TSource, Int32>)
- public statique Int64 Max <TSource> (ce sélecteur IEnumerable <TSource>, Func <TSource, Int64>)
- public statique Nullable <Décimal> Max <TSource> (ce sélecteur IEnumerable <TSource>, Func <TSource, Nullable <Decimal >>)
- public statique Nullable <Double> Max <TSource> (cette source IEnumerable <TSource>, Func <TSource, Nullable <Double >> sélecteur)
- public statique Nullable <Int32> Max <TSource> (cette source IEnumerable <TSource>, Func <TSource, Nullable <Int32 >> sélecteur)
- public statique Nullable <Int64> Max <TSource> (cette source IEnumerable <TSource>, Func <TSource, Nullable <Int64 >>)
- public statique Nullable <Single> Max <TSource> (cette source IEnumerable <TSource>, Func <TSource, sélecteur <Single >>)
- statique publique Single Max <TSource> (cette source IEnumerable <TSource>, Func <TSource, Single> sélecteur)
- statique publique TResult Max <TSource, TResult> (ce sélecteur IEnumerable <TSource>, Func <TSource, TResult>)
- public decimal min decimal (cette source IEnumerable <Decimal>)
- public static Double Min (cette source IEnumerable <Double>)
- public static Int32 Min (cette source IEnumerable <Int32>)
- public static Int64 Min (cette source IEnumerable <Int64>)
- public static Nullable <Decimal> Min (cette source IEnumerable <Nullable <Decimal >>)
- public static Nullable <Double> Min (cette source IEnumerable <Nullable <Double >>)
- public static Nullable <Int32> Min (cette source IEnumerable <Nullable <Int32 >>)
- public static Nullable <Int64> Min (cette source IEnumerable <Nullable <Int64 >>)
- public static Nullable <Single> Min (cette source IEnumerable <Nullable <Single >>)
- public static Single Min (cette source IEnumerable <Single>)
- statique publique TSource Min <TSource> (cette source IEnumerable <TSource>)
- statique publique décimale min <TSource> (ce sélecteur IEnumerable <TSource>, Func <TSource, Decimal>)
- statique publique Double Min <TSource> (cette source IEnumerable <TSource>, Func <TSource, Double> sélecteur)
- public static Int32 Min <TSource> (ce sélecteur IEnumerable <TSource>, Func <TSource, Int32>)
- public static Int64 Min <TSource> (ce sélecteur IEnumerable <TSource>, Func <TSource, Int64>)
- public static Nullable <Decimal> Min <TSource> (ce sélecteur IEnumerable <TSource>, Func <TSource, Nullable <Decimal >>)
- public statique Nullable <Double> Min <TSource> (cette source IEnumerable <TSource>, Func <TSource, Nullable <Double >> sélecteur)
- public statique Nullable <Int32> Min <TSource> (cette source IEnumerable <TSource>, Func <TSource, sélecteur Nullable <Int32 >>)
- public statique Nullable <Int64> Min <TSource> (cette source IEnumerable <TSource>, Func <TSource, Nullable <Int64 >>)
- public static Nullable <Single> Min <TSource> (cette source IEnumerable <TSource>, Func <TSource, sélecteur <Single >>)
- statique publique Single Min <TSource> (cette source IEnumerable <TSource>, Func <TSource, Single> sélecteur)
- statique publique TResult Min <TSource, TResult> (ce sélecteur IEnumerable <TSource>, Func <TSource, TResult>)
- public statique IEnumerable <TResult> OfType <TResult> (cette source IEnumerable)
- public statique IOrderedEnumerable <TSource> OrderBy <TSource, TKey> (cette source IEnumerable <TSource>, Func <TSource, TKey> keySelector)
- public statique IOrderedEnumerable <TSource> OrderBy <TSource, TKey> (cette source IEnumerable <TSource>, Func <TSource, TKey> cléSelector, IComparer <TKey> comparer
- public statique IOrderedEnumerable <TSource> OrderByDescending <TSource, TKey> (cette source IEnumerable <TSource>, Func <TSource, TKey> keySelector)
- public statique IOrderedEnumerable <TSource> OrderByDescending <TSource, TKey> (cette source IEnumerable <TSource>, Func <TSource, TKey> cléSelector, IComparer <TKey> comparer
- public static IEnumerable <Int32> Range (démarrage Int32, nombre Int32)
- public static IEnumerable <TResult> Répéter <TResult> (élément TResult, nombre Int32)
- statique publique IEnumerable <TSource> Reverse <TSource> (cette source IEnumerable <TSource>)
- public static IEnumerable <TResult> Sélectionnez <TSource, TResult> (ce sélecteur IEnumerable <TSource>, Func <TSource, TResult>)
- public static IEnumerable <TResult> Sélectionnez <TSource, TResult> (ce sélecteur IEnumerable <TSource>, Func <TSource, Int32, TResult>)
- public statique IEnumerable <TResult> SelectMany <TSource, TResult> (cette source IEnumerable <TSource>, Func <TSource, IEnumerable <TResult >>)
- public statique IEnumerable <TResult> SelectMany <TSource, TResult> (cette source IEnumerable <TSource>, Func <TSource, Int32, IEnumerable <TResult >> sélecteur)
- public statique IEnumerable <TResult> SelectMany <TSource, TCollection, TResult> (cette source IEnumerable <TSource>, Func <TSource, IEnumerable <TCollection >> collectionSelector, Func <TSource, TCollection, TResult> resultSelector)
- public statique IEnumerable <TResult> SelectMany <TSource, TCollection, TResult> (cette source IEnumerable <TSource>, Func <TSource, Int32, IEnumerable <TCollection >> collectionSelector, Func <TSource, TCollection, TResult> resultSelector)
- public statique Boolean SequenceEqual <TSource> (ceci IEnumerable <TSource> d'abord, IEnumerable <TSource> second)
- public statique Boolean SequenceEqual <TSource> (ceci IEnumerable <TSource> en premier, IEnumerable <TSource> second, IEqualityComparer <TSource> comparer)
- statique publique TSource Single <TSource> (cette source IEnumerable <TSource>)
- statique publique TSource Single <TSource> (cet prédicat IEnumerable <TSource>, Func <TSource, Boolean>)
- statique publique TSource SingleOrDefault <TSource> (cette source IEnumerable <TSource>)
- statique publique TSource SingleOrDefault <TSource> (ce prédicat IEnumerable <TSource>, Func <TSource, Boolean>)
- public static IEnumerable <TSource> Ignorer <TSource> (cette source IEnumerable <TSource>, nombre Int32)
- public statique IEnumerable <TSource> SkipWhile <TSource> (cet prédicat IEnumerable <TSource>, Func <TSource, Boolean>)
- public statique IEnumerable <TSource> SkipWhile <TSource> (cette source IEnumerable <TSource>, Func <TSource, Int32, Boolean> prédicat)
- Sum décimal statique public (cette source IEnumerable <Decimal>)
- statique publique Double Sum (cette source IEnumerable <Double>)
- statique statique Int32 Sum (cette source IEnumerable <Int32>)
- public statique Int64 Sum (cette source IEnumerable <Int64>)
- public statique Nullable <Decimal> Sum (cette source IEnumerable <Nullable <Decimal >>)
- public statique Nullable <Double> Sum (cette source IEnumerable <Nullable <Double >>)
- public statique Nullable <Int32> Sum (cette source IEnumerable <Nullable <Int32 >>)
- public static Nullable <Int64> Sum (cette source IEnumerable <Nullable <Int64 >>)
- public statique Nullable <Single> Sum (cette source IEnumerable <Nullable <Single >>)
- statique publique Single Sum (cette source IEnumerable <Single>)
- Somme décimale statique publique <TSource> (ce sélecteur IEnumerable <TSource>, Func <TSource, Decimal>)
- statique publique Double Sum <TSource> (cette source IEnumerable <TSource>, Func <TSource, Double> sélecteur)
- statique publique Int32 Sum <TSource> (ce sélecteur IEnumerable <TSource>, Func <TSource, Int32>)
- statique publique Int64 Somme <TSource> (cette source IEnumerable <TSource>, Func <TSource, Int64> sélecteur)
- public statique Nullable <Decimal> Sum <TSource> (ce sélecteur IEnumerable <TSource>, Func <TSource, Nullable <Decimal >>)
- statique publique Nullable <Double> Sum <TSource> (cette source IEnumerable <TSource>, Func <TSource, Nullable <Double >>)
- statique publique Nullable <Int32> Somme <TSource> (cette source IEnumerable <TSource>, Func <TSource, Nullable <Int32 >> sélecteur)
- public statique Nullable <Int64> Sum <TSource> (cette source IEnumerable <TSource>, Func <TSource, Nullable <Int64 >>)
- statique publique Nullable <Single> Sum <TSource> (ce sélecteur IEnumerable <TSource>, Func <TSource, Nullable <Single >>)
- statique publique Single Sum <TSource> (cette source IEnumerable <TSource>, Func <TSource, Single> sélecteur)
- public static IEnumerable <TSource> Take <TSource> (cette source IEnumerable <TSource>, nombre Int32)
- public statique IEnumerable <TSource> TakeWhile <TSource> (ce prédicat IEnumerable <TSource>, Func <TSource, Boolean>)
- public statique IEnumerable <TSource> TakeWhile <TSource> (cette source IEnumerable <TSource>, Func <TSource, Int32, Boolean> prédicat)
- public statique IOrderedEnumerable <TSource> ThenBy <TSource, TKey> (cette source IOrderedEnumerable <TSource>, Func <TSource, TKey> keySelector)
- public statique IOrderedEnumerable <TSource> ThenBy <TSource, TKey> (cette source IOrderedEnumerable <TSource>, Func <TSource, TKey> cléSelector, IComparer <TKey> comparer
- public statique IOrderedEnumerable <TSource> ThenByDescending <TSource, TKey> (cette source IOrderedEnumerable <TSource>, Func <TSource, TKey> keySelector)
- public statique IOrderedEnumerable <TSource> ThenByDescending <TSource, TKey> (cette source IOrderedEnumerable <TSource>, Func <TSource, TKey> cléSelector, IComparer <TKey> comparer
- statique publique TSource [] ToArray <TSource> (cette source IEnumerable <TSource>)
- Dictionnaire statique public <TKey, TSource> ToDictionary <TSource, TKey> (cette source IEnumerable <TSource>, Func <TSource, TKey> keySelector)
- Dictionnaire statique public <TKey, TSource> ToDictionary <TSource, TKey> (cette source IEnumerable <TSource>, Func <TSource, TKey> KeySelector, IEqualityComparer <TKey> comparer
- Dictionnaire statique public <TKey, TElement> ToDictionary <TSource, TKey, TElement> (cette source IEnumerable <TSource>, Func <TSource, TKey> KeySelector, Func <TSource, TElement> elementSelector)
- Dictionnaire statique public <TKey, TElement> ToDictionary <TSource, TKey, TElement> (cette source IEnumerable <TSource>, Func <TSource, TKey> KeySelector, Func <TSource, TElement> elementSelector, IEqualityComparer <TKey> comparer
- Liste statique publique <TSource> ToList <TSource> (cette source IEnumerable <TSource>)
- ILookup statique public <TKey, TSource> ToLookup <TSource, TKey> (cette source IEnumerable <TSource>, Func <TSource, TKey> keySelector)
- ILookup statique public <TKey, TSource> ToLookup <TSource, TKey> (cette source IEnumerable <TSource>, Func <TSource, TKey> KeySelector, IEqualityComparer <TKey> comparer)
- ILookup statique public <TKey, TElement> ToLookup <TSource, TKey, TElement> (cette source IEnumerable <TSource>, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector)
- ILookup statique public <TKey, TElement> ToLookup <TSource, TKey, TElement> (cette source IEnumerable <TSource>, Func <TSource, TKey> sélecteur de clés, Func <TSource, TElement> elementSelector, IEqualityComparer <TKey> comparer
- public statique IEnumerable <TSource> Union <TSource> (ceci IEnumerable <TSource> d'abord, IEnumerable <TSource> second)
- public statique IEnumerable <TSource> Union <TSource> (ceci IEnumerable <TSource> en premier, IEnumerable <TSource> second, IEqualityComparer <TSource> comparer)
- public statique IEnumerable <TSource> Où <TSource> (cette source IEnumerable <TSource>, Func <TSource, Boolean> prédicat)
- public statique IEnumerable <TSource> Où <TSource> (cette source IEnumerable <TSource>, Func <TSource, Int32, Boolean> prédicat)
- public statique IEnumerable <TResult> Zip <TFirst, TSecond, TResult> (cet IEnumerable <TFirst> en premier, IEnumerable <TSecond> second, Func <TFirst, TSecond, TResult> resultSelector)
Remarques
- Voir aussi LINQ .
Les méthodes intégrées LINQ sont des méthodes d'extension pour l'interface IEnumerable<T>
qui vivent dans la classe System.Linq.Enumerable
de l'assembly System.Core
. Ils sont disponibles dans .NET Framework 3.5 et versions ultérieures.
LINQ permet la modification, la transformation et la combinaison simples de divers IEnumerable
utilisant une syntaxe de type requête ou fonctionnelle.
Alors que les méthodes LINQ standard peuvent fonctionner sur tout IEnumerable<T>
, y compris les tableaux simples et List<T>
, elles peuvent également être utilisées sur des objets de base de données, où l’ensemble des expressions LINQ peut être transformé en SQL si le objet de données le prend en charge. Voir LINQ to SQL .
Pour les méthodes qui comparent des objets (tels que Contains
et Except
), IEquatable<T>.Equals
est utilisé si le type T de la collection implémente cette interface. Sinon, les Equals
standard et GetHashCode
du type (éventuellement remplacées par les implémentations d' Object
par défaut) sont utilisées. Il existe également des surcharges pour ces méthodes qui permettent de spécifier un IEqualityComparer<T>
.
Pour les méthodes ...OrDefault
, la default(T)
est utilisée pour générer des valeurs par défaut.
Référence officielle: Classe énumérable
Évaluation paresseuse
Pratiquement chaque requête qui renvoie un IEnumerable<T>
n'est pas évaluée immédiatement; au lieu de cela, la logique est retardée jusqu'à ce que la requête soit répétée. Une implication est que chaque fois que quelqu'un parcourt un IEnumerable<T>
créé à partir de l'une de ces requêtes, par exemple .Where()
, la logique de requête complète est répétée. Si le prédicat est de longue durée, cela peut entraîner des problèmes de performances.
Une solution simple (lorsque vous connaissez ou pouvez contrôler la taille approximative de la séquence résultante) consiste à mettre les résultats en mémoire tampon en utilisant .ToArray()
ou .ToList()
. .ToDictionary()
ou .ToLookup()
peuvent remplir le même rôle. Bien entendu, on peut également parcourir toute la séquence et mettre les éléments en mémoire tampon selon une autre logique personnalisée.
ToArray()
ou ToList()
?
Les deux .ToArray()
et .ToList()
parcourent tous les éléments d'une séquence IEnumerable<T>
et enregistrent les résultats dans une collection stockée en mémoire. Utilisez les directives suivantes pour déterminer laquelle choisir:
- Certaines API peuvent nécessiter un
T[]
ou uneList<T>
. -
.ToList()
s'exécute généralement plus rapidement et génère moins de déchets que.ToArray()
, car ce dernier doit copier tous les éléments dans une nouvelle collection de taille fixe une fois de plus, dans presque tous les cas. - Les éléments peuvent être ajoutés ou supprimés de la
List<T>
renvoyée par.ToList()
, tandis que leT[]
renvoyé par.ToArray()
reste une taille fixe tout au long de sa durée de vie. En d'autres termes,List<T>
est modifiable etT[]
est immuable. - Le
T[]
renvoyé par.ToArray()
utilise moins de mémoire que leList<T>
renvoyé par.ToList()
, donc si le résultat doit être stocké pendant longtemps, préférez.ToArray()
. LaList<T>.TrimExcess()
appelsList<T>.TrimExcess()
rendrait la différence de mémoire strictement académique, au détriment de l'avantage relatif de la vitesse de.ToList()
.
Sélectionnez (carte)
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
Ce type de fonction est généralement appelé map
dans les langages de programmation fonctionnels.
Où (filtre)
Cette méthode retourne un IEnumerable avec tous les éléments correspondant à l'expression lambda
Exemple
var personNames = new[]
{
"Foo", "Bar", "Fizz", "Buzz"
};
var namesStartingWithF = personNames.Where(p => p.StartsWith("F"));
Console.WriteLine(string.Join(",", namesStartingWithF));
Sortie:
Foo, Fizz
Commandé par
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
Contient
var numbers = new[] {1,2,3,4,5};
Console.WriteLine(numbers.Contains(3)); //True
Console.WriteLine(numbers.Contains(34)); //False
Sauf
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
Couper
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
Notez que les doublons sont conservés dans le résultat. Si cela n'est pas souhaitable, utilisez Union
place.
Premier (trouver)
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
L'exemple suivant lance InvalidOperationException
avec le message "La séquence ne contient aucun élément correspondant":
var firstNegativeNumber = numbers.First(n => n < 0);
Unique
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
La suite lance InvalidOperationException
car il y a plus d'un élément dans la séquence:
var theOnlyNumberInNumbers = numbers.Single();
var theOnlyNegativeNumber = numbers.Single(n => n < 0);
Dernier
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
L'exemple suivant lance 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
L'exemple suivant lance 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
Tout
Renvoie true
si la collection contient des éléments répondant à la condition de l'expression 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
Tout
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
Notez que la méthode All
fonctionne en vérifiant que le premier élément est évalué comme false
selon le prédicat. Par conséquent, la méthode retournera true
pour tout prédicat dans le cas où l'ensemble est vide:
var numbers = new int[0];
var allNumbersArePositive = numbers.All(n => n > 0);
Console.WriteLine(allNumbersArePositive); //True
SelectMany (carte plate)
Enumerable.Select
renvoie un élément de sortie pour chaque élément d'entrée. Alors que Enumerable.SelectMany
produit un nombre variable d'éléments de sortie pour chaque élément d'entrée. Cela signifie que la séquence de sortie peut contenir plus ou moins d’éléments que ceux de la séquence d’entrée.
Lambda expressions
transmises à Enumerable.Select
doivent renvoyer un seul élément. Les expressions lambda transmises à Enumerable.SelectMany
doivent produire une séquence enfant. Cette séquence enfant peut contenir un nombre variable d'éléments pour chaque élément de la séquence d'entrée.
Exemple
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()));
Sortie:
1,2,3,4,5,6
Enumerable.SelectMany
peut également être obtenue avec une requête basée syntaxe en utilisant deux consécutifs from
clauses:
var allInvoicesFromAllCustomers
= from customer in customers
from invoice in customer.Invoices
select invoice;
Somme
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
Sauter
Skip énumère les N premiers éléments sans les retourner. Une fois le numéro d'article N + 1 atteint, Skip commence à renvoyer tous les éléments énumérés:
var numbers = new[] {1,2,3,4,5};
var allNumbersExceptFirstTwo = numbers.Skip(2);
Console.WriteLine(string.Join(",", allNumbersExceptFirstTwo.ToArray()));
//3,4,5
Prendre
Cette méthode prend les n
premiers éléments d'un énumérable.
var numbers = new[] {1,2,3,4,5};
var threeFirstNumbers = numbers.Take(3);
Console.WriteLine(string.Join(",", threeFirstNumbers.ToArray()));
//1,2,3
SéquenceEqual
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
Sens inverse
var numbers = new[] {1,2,3,4,5};
var reversed = numbers.Reverse();
Console.WriteLine(string.Join(",", reversed.ToArray()));
//5,4,3,2,1
De type
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
Moyenne
var numbers = new[] {1,2,3,4};
var averageNumber = numbers.Average();
Console.WriteLine(averageNumber);
// 2,5
Cette méthode calcule la moyenne des nombres énumérables.
var cities = new[] {
new {Population = 1000},
new {Population = 2000},
new {Population = 4000}
};
var averagePopulation = cities.Average(c => c.Population);
Console.WriteLine(averagePopulation);
// 2333,33
Cette méthode calcule la moyenne des énumérables à l'aide de la fonction déléguée.
Zip *: français
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
Distinct
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
Par groupe
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
Regrouper les factures par pays, générer un nouvel objet avec le numéro d'enregistrement, le total payé et la moyenne payée
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) });
Si nous voulons seulement les totaux, aucun groupe
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) });
Si nous avons besoin de plusieurs comptes
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
Renvoie un nouveau dictionnaire à partir de la source IEnumerable
à l'aide de la fonction keySelector fournie pour déterminer les clés. Lance une exception ArgumentException
si keySelector n'est pas injectif (renvoie une valeur unique pour chaque membre de la collection source). Des surcharges permettent de spécifier la valeur à stocker ainsi que la clé.
var persons = new[] {
new { Name="Fizz", Id=1},
new { Name="Buzz", Id=2},
new { Name="Foo", Id=3},
new { Name="Bar", Id=4},
};
La spécification d'une simple fonction de sélection de clé créera un Dictionary<TKey,TVal>
avec TKey
le type de retour du sélecteur à clé, TVal
le type d'objet d'origine et l'objet d'origine comme valeur stockée.
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
La spécification d'une fonction de sélecteur de valeur créera également un Dictionary<TKey,TVal>
avec TKey
le type de retour du sélecteur de clé, mais TVal
maintenant le type de retour de la fonction de sélection de valeur et la valeur renvoyée comme valeur stockée.
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
Comme indiqué ci-dessus, les clés renvoyées par le sélecteur de clé doivent être uniques. Le suivant lancera une exception.
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)
Si une clé unique ne peut pas être donnée pour la collection source, envisagez d'utiliser ToLookup à la place. En apparence, ToLookup se comporte de la même manière que ToDictionary, mais dans la recherche résultante, chaque clé est associée à une collection de valeurs avec des clés correspondantes.
syndicat
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
Notez que les doublons sont supprimés du résultat. Si cela n'est pas souhaitable, utilisez Concat
place.
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[]
Lister
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
Compter
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
Agrégat (pli)
Générer un nouvel objet à chaque étape:
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,
En utilisant le même objet dans toutes les étapes:
var commaSeparatedElements2 = elements.Aggregate(
seed: new StringBuilder(),
func: (seed, element) => seed.Append($"{element},"));
Console.WriteLine(commaSeparatedElements2.ToString()); //1,2,3,4,5,
En utilisant un sélecteur de résultat:
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,
Si une graine est omise, le premier élément devient la graine:
var seedAndElements = elements.Select(n=>n.ToString());
var commaSeparatedElements4 = seedAndElements.Aggregate(
func: (aggregate, element) => $"{aggregate}{element},");
Console.WriteLine(commaSeparatedElements4); //12,3,4,5,
Pour rechercher
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
Joindre
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
Jeter
Cast
est différent des autres méthodes de Enumerable
en ce qu’il s’agit d’une méthode d’extension pour IEnumerable
, pas pour IEnumerable<T>
. Ainsi, il peut être utilisé pour convertir des instances de la première en instances de la dernière.
Cela ne compile pas car ArrayList
pas IEnumerable<T>
:
var numbers = new ArrayList() {1,2,3,4,5};
Console.WriteLine(numbers.First());
Cela fonctionne comme prévu:
var numbers = new ArrayList() {1,2,3,4,5};
Console.WriteLine(numbers.Cast<int>().First()); //1
Cast
n'effectue pas de conversion. Ce qui suit compile mais lève InvalidCastException
à l'exécution:
var numbers = new int[] {1,2,3,4,5};
decimal[] numbersAsDecimal = numbers.Cast<decimal>().ToArray();
La méthode appropriée pour effectuer une conversion de conversion en une collection est la suivante:
var numbers= new int[] {1,2,3,4,5};
decimal[] numbersAsDecimal = numbers.Select(n => (decimal)n).ToArray();
Vide
Pour créer un IEnumerable vide de int:
IEnumerable<int> emptyList = Enumerable.Empty<int>();
Ce IEnumerable vide est mis en cache pour chaque type T, de sorte que:
Enumerable.Empty<decimal>() == Enumerable.Empty<decimal>(); // This is True
Enumerable.Empty<int>() == Enumerable.Empty<decimal>(); // This is False
Puis par
ThenBy
ne peut être utilisé qu'après une clause OrderBy
permettant de commander en utilisant plusieurs critères
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
Gamme
Les deux paramètres de la Range
sont le premier nombre et le nombre d'éléments à produire (pas le dernier nombre).
// 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)));
Jointure externe gauche
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}");
}
Répéter
Enumerable.Repeat
génère une séquence d'une valeur répétée. Dans cet exemple, il génère 4 fois "Bonjour".
var repeats = Enumerable.Repeat("Hello", 4);
foreach (var item in repeats)
{
Console.WriteLine(item);
}
/* output:
Hello
Hello
Hello
Hello
*/