Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

.NET 3.5 : Une nouvelle collection, le Lookup

Linq introduit un bon nombre d'opérateurs disponibles pour les interfaces IEnumerable et IQueryable. La liste exhaustive de ces opérateurs peut être trouvée ici : http://msdn2.microsoft.com/en-us/library/bb394939.aspx.

Parmi ces opérateurs, il y a une catégorie "Conversion operators", qui contient entre autres ToArray, ToList et ToDictionary. Celle dont je m'intéresse ici est ToLookup.

Cette méthode renvoie un objet de type Lookup<TKey, TSource>. Cette classe implémente l'interface ILookup dont voici la définition :

public interface ILookup<TKey, TElement> : IEnumerable<IGrouping<TKey, TElement>>, IEnumerable
{
    int Count { get; }
    IEnumerable<TElement> this[TKey key] { get; }
    bool Contains(TKey key);
}

et voici la définition de IGrouping qui va avec :

public interface IGrouping<TKey, TElement> : IEnumerable<TElement>, IEnumerable
{
    TKey Key { get; }
}

Lookup est donc très semblable à IDictionary, a la différence qu'il peut y avoir plusieurs éléments correspondant à la même clé. ILookup associe à chaque clé une énumération de valeurs.

J'ai jeté un coup d'oeil dans Reflector pour savoir comment Lookup est implémenté, et il s'agit en fait d'une hashtable (tout comme Dictionary). Cela rend le Lookup très efficace car la complexité en accès est dans la plupart des cas constante (O(1)).

Le type de la clé (TKey) nécessite donc une comparaison d'égalité (IEqualityComparer) qu'il est possible de fournir en argument à la méthode d'extension ToLookup lors de la création du Lookup. Si vous utilisez la surcharge qui ne précise aucun IEqualityComparer, le comparateur par défaut pour TKey sera utilisé. Je rappelle que le comparateur par défaut recherche si le type implémente IEquatable, si oui, il l'utilise pour déterminer l'égalité de deux clés, sinon il utilise l'implémentation de Equals fourni par TKey (qui au pire sera héritée de object). Pour obtenir le hash code de la clé, le comparateur par défaut appelle simplement GetHashCode sur l'instance (qui est souvent hérité de object).

Si vous allez voir les implémentations des opérateurs pour IEnumerable dans Reflector, vous verrez que le Lookup est beaucoup utilisé (par exemple pour Join, GroupBy...).

A noter qu'il n'y a aucun constructeur public pour Lookup, et que la seule façon d'en créer un est d'utiliser la méthode d'extension ToLookup. Il n'est pas possible non plus d'ajouter ou de supprimer des éléments une fois le Lookup créé.

Publié lundi 3 décembre 2007 13:00 par RaptorXP
Classé sous : , ,
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

# re: .NET 3.5 : Une nouvelle collection, le Lookup

Pas mal cette extention ToLookUp !

J'ai déjà codé auparavant en 2.0 une fonction similaire:

///

<summary>

       /// Organises the specified objects by the specified object"key" using the specified delegate

       /// </summary>

<param name="objectsToOrganise" />

       /// The object"key" retriever delegate.

<returns>A dictionary of values </returns>

<TSortBy, ICollection<TSortWhat="">&gt; OrganizeObjectsBy<TSortBy, TSortWhat="">(IEnumerable<TSortWhat> objectsToOrganise,

                                                                                                        RetrieveObjectKeyHandler<TSortWhat, TSortBy=""> objectKeyRetriever)

       {

           Common.Diagnostics.ParamCode.AssertNotNull(objectsToOrganise, "objectsToOrganise");

           Common.Diagnostics.ParamCode.AssertNotNull(objectKeyRetriever, "objectKeyRetriever");

           IDictionary<TSortBy, ICollection<TSortWhat="">&gt; sortedObjects = new Dictionary<TSortBy, ICollection<TSortWhat="">&gt;();

           foreach (TSortWhat obj in objectsToOrganise)

           {

               //retrieve the object key using the specified delegate

               TSortBy key = objectKeyRetriever(obj);

               if (!sortedObjects.ContainsKey(key))

                   sortedObjects.Add(key, new List<TSortWhat>());

               sortedObjects[key].Add(obj);

           }

           return sortedObjects;

       }

       /// <summary>

       /// A delegate used to retreive an Object representing key

       /// </summary>

       /// <typeparam name="TObj">the object type</typeparam>

       /// <typeparam name="TKey">the key type </typeparam>

       /// <param name="obj" />the object from which the delegate retreives the key

       /// <returns>the retrieved key from the specified object</returns>

       public delegate TKey RetrieveObjectKeyHandler<TObj, TKey="">(TObj obj);

EXEMPLE:

IDictionary<Contact, ICollection<Order="">&gt; ordersByContact = CollectionHelper.OrganizeObjectsBy<Contact,Order>(orderCollection, delegate(Order order) { return order.Owner; });

... plutot pratique ;o)

mardi 4 décembre 2007 15:57 by BxB

# re: .NET 3.5 : Une nouvelle collection, le Lookup

A noter que la classe Lookup existe également. Cette classe implémente ILookup. En revanche, cette classe ne possède pas de constructeur. Elle possède une méthode static Create mais internal. Du coup, la seule façon propre (j'exclu donc la réflexion sur la méthode Create) de récupérer une instance de Lookup est justement l'extension method ToLookup.

mercredi 12 décembre 2007 10:55 by Matthieu MEZIL

# re: .NET 3.5 : Une nouvelle collection, le Lookup

Oui c'est exact Mathieu, d'ailleurs regarde, j'en parle déjà dans mon article ;) (Dernier paragraphe).

jeudi 13 décembre 2007 17:36 by RaptorXP
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01