web-dev-qa-db-fra.com

quelle est la différence entre liste <> et dictionnaire <> en c #

J'ai un doute étrange concernant liste et dictionnaire en c #

Dans une liste, nous ajoutons des éléments à la liste en utilisant la méthode suivante

using System.Collections.Generic;

class Program
{
    static void Main()
    {
       List<int> list = new List<int>();
       list.Add(2);
       list.Add(3);
       list.Add(5);
       list.Add(7);
    }
}

Dans un dictionnaire, nous ajoutons des éléments comme celui-ci ...

using System;
using System.Collections.Generic;

class Program
{
   static void Main()
   {
      Dictionary<string, int> d = new Dictionary<string, int>();
      d.Add("cat", 2);
      d.Add("dog", 1);
      d.Add("llama", 0);
      d.Add("iguana", -1);
   }
}

Je ne sais pas exactement quelle est la différence, mais dans un dictionnaire, nous ajoutons des éléments tels qu'une paire (clé, valeur) et dans une liste, nous ajoutons simplement des éléments sans spécifier de clé.

Quelqu'un voudrait-il clarifier cela?

16
rockyashkumar

IDictionary est pour les cartes clé-> valeur, ICollection est pour les ensembles d'objets similaires.

ICollection est une interface pour des collections d'objets similaires: les contrôles d'un formulaire, les éléments d'une liste, les attributs d'une balise XML, etc. A partir de .NET 2.0, il existe une version générique, vous pouvez donc vous référer à une collection d'entiers sous la forme ICollection<int>.

IDictionary est une interface permettant de mapper un type d'objet ou une valeur sur un autre. Cela fonctionne comme un vrai dictionnaire ou un annuaire téléphonique: vous avez une "clé" en tête, comme le nom d’une personne, et lorsque vous la recherchez, vous obtenez des informations identifiées par cette clé, comme une adresse ou un numéro de téléphone. Chaque clé ne peut être répertoriée qu'une seule fois, bien que deux clés différentes puissent toujours avoir la même valeur. Ceci est également générique dans .NET 2.0, donc un dictionnaire dont les clés sont des chaînes et dont les valeurs sont des entiers serait IDictionary<string,int>.

Un dictionnaire est en réalité une collection de paires clé/valeur: vous pouvez utiliser un IDictionary<int,string> en tant que ICollection<KeyValuePair<int,string>> et vous pouvez accéder aux clés et aux valeurs sous forme de collections séparées avec les propriétés Keys et Values.

ICollection et IDictionary ne sont pas ordonnés, ce qui signifie que même si vous pouvez récupérer les éléments dans un ordre quelconque avec la méthode CopyTo ou une boucle foreach, cet ordre n'a pas de signification particulière et peut changer sans raison apparente. C’est la principale différence entre ICollection et IList: une liste vous permet de placer des éléments dans des positions spécifiques, comme un tableau, et ils y restent jusqu’à ce que vous les déplaciez.

30
SShebly

List<> et Dictionary<,> - des structures de données très différentes qui ont été utilisées à des fins différentes, List est simplement un ensemble d'éléments et Dictionary est un ensemble de paires clé-valeur.

Le dictionnaire est très utile lorsque vous avez un ensemble d’objets complexes et que vous voulez avoir un accès rapide, par exemple, ObjectName/ObjectId, dans ce cas, vous créez IDictionary<string, TObject> où key serait ObjectId et Value, un objet lui-même.

Quelques différences:

  • Liste ordre persistant des éléments, le dictionnaire ne le fait pas
  • Liste permettant un accès rapide par index
  • Liste prise en charge intégrée dans l'algorithme QuickSort pour un tri rapide des données
  • Le dictionnaire permet à ~ O(1) complexité temporelle d'accéder à un élément (valeur) à l'aide d'une clé
10
sll
  • Dictionary<K,V> est un tableau associatif ou une carte. C'est un conteneur qui peut être indexé par des valeurs de n'importe quel type.
  • List<T> est un tableau indexé entier. C'est un conteneur qui est indexé par des entiers contigus.

La différence essentielle réside donc dans la manière dont les conteneurs sont indexés.

Ne tombez pas dans le piège de croire que Dictionary<int,T> est sémantiquement équivalent à List<T>. La différence est que l'indexation de List<T> est contiguë alors qu'il peut y avoir lacunes dans l'indexation pour Dictionary<int,T>.

6
David Heffernan

J'ai une bibliothèque de classe qui accède à une variété de sprocs T-sql; chaque sproc renvoie une seule ligne mais des colonnes différentes. J'avais besoin d'une solution générale pour récupérer les valeurs et Dictionary <> fournissait une solution beaucoup plus propre que List <>.

La classe commune à tous les wrappers déclare

public Dictionary<string, String> datadict = new Dictionary<string, string>();

et

public Dictionary<string, String> LoadData(string sproc, string paramName, string paramValue)

Invoquer un lecteur, le datadict est chargé avec 

for (int i = Reader.FieldCount; i != 0; i--)
 {
  datadict.Add(Reader.GetName(i - 1).Trim(), Reader.GetString(i - 1).Trim());
 }

et renvoie datadict à la classe appelante, qui peut ensuite récupérer les données de la même manière que le fait Reader; Par exemple.:

datadict = myData.LoadData("spGetSSN", "", "");
  ssn1 = datadict["SSN1"];
  ssn2 = datadict["SSN2"];
  ssn3 = datadict["SSN3"];

Beaucoup plus propre pour moi cette liste <>.

0
john rains