131 votes

Pourquoi puis-je initialiser une liste comme un tableau en C #?

Aujourd'hui, j'ai été surpris de constater que dans C # je peux faire:

 List<int> a = new List<int> { 1, 2, 3 };
 

Pourquoi est-ce que je peux faire ça? Quel constructeur s'appelle? Comment puis-je le faire avec mes propres cours? Je sais que c'est la façon d'initialiser les tableaux mais les tableaux sont des éléments de langage et les listes sont des objets simples ...

183voto

James Michael Hare Points 19077

Cela fait partie de la collection de l'initialiseur de la syntaxe .NET. Vous pouvez utiliser cette syntaxe sur toute collection, vous créez tant que:

  • Il met en oeuvre IEnumerable (de préférence IEnumerable<T>)

  • Il a une méthode nommée Add(...)

Ce qui se passe est le constructeur par défaut est appelé, puis Add(...) est appelée pour chaque membre de l'initialiseur.

Ainsi, ces deux blocs sont à peu près identiques:

List<int> a = new List<int> { 1, 2, 3 };

Et

List<int> temp = new List<int>();
temp.Add(1);
temp.Add(2);
temp.Add(3);
List<int> a = temp;

Vous pouvez appeler un autre constructeur, si vous voulez, par exemple pour éviter le surdimensionnement de l' List<T> pendant la culture, etc:

// Notice, calls the List constructor that takes an int arg
// for initial capacity, then Add()'s three items.
List<int> a = new List<int>(3) { 1, 2, 3, }

Notez que l' Add() méthode n'a pas besoin de prendre un seul élément, par exemple le Add() méthode de Dictionary<TKey, TValue> prend deux éléments:

var grades = new Dictionary<string, int>
    {
        { "Suzy", 100 },
        { "David", 98 },
        { "Karen", 73 }
    };

Est à peu près identique à:

var temp = new Dictionary<string, int>();
temp.Add("Suzy", 100);
temp.Add("David", 98);
temp.Add("Karen", 73);
var grades = temp;

Donc, pour l'ajouter à votre propre classe, tout ce que vous devez faire, comme mentionné, est de mettre en œuvre IEnumerable (encore une fois, de préférence, IEnumerable<T>) et de créer un ou plusieurs Add() méthodes:

public class SomeCollection<T> : IEnumerable<T>
{
    // implement Add() methods appropriate for your collection
    public void Add(T item)
    {
        // your add logic    
    }

    // implement your enumerators for IEnumerable<T> (and IEnumerable)
    public IEnumerator<T> GetEnumerator()
    {
        // your implementation
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

Ensuite, vous pouvez l'utiliser comme la BCL collections:

public class MyProgram
{
    private SomeCollection<int> _myCollection = new SomeCollection<int> { 13, 5, 7 };    

    // ...
}

(Pour plus d'informations, consultez le MSDN)

11voto

Krizz Points 7273

C'est ce qu'on appelle le sucre syntactique .

List<T> est la classe "simple", mais le compilateur lui accorde un traitement spécial pour vous faciliter la vie.

Celui-ci s'appelle l' initialiseur de collection . Vous devez implémenter la méthode IEnumerable<T> et Add .

8voto

Selon la spécification C # Version 3.0 "L'objet de collection auquel un initialiseur de collection est appliqué doit être d'un type qui implémente System.Collections.Generic.ICollection pour exactement un T."

Cependant, ces informations semblent inexactes au moment de la rédaction de ce document; voir la clarification d'Eric Lippert dans les commentaires ci-dessous.

6voto

vc 74 Points 15694

Cela fonctionne grâce aux initialiseurs de collection qui requièrent fondamentalement que la collection implémente une méthode Add et qui fera le travail pour vous.

6voto

nawfal Points 13500

Une autre chose intéressante à propos des initialiseurs de collection est que vous pouvez avoir plusieurs surcharges de la méthode Add et que vous pouvez tous les appeler dans le même initialiseur! Par exemple, cela fonctionne:

 public class MyCollection<T> : IEnumerable<T>
{
    public void Add(T item, int number)
    {

    }
    public void Add(T item, string text) 
    {

    }
    public bool Add(T item) //return type could be anything
    {

    }
}

var myCollection = new MyCollection<bool> 
{
    true,
    { false, 0 },
    { true, "" },
    false
};
 

Il appelle les surcharges correctes. En outre, il recherche uniquement la méthode nommée Add , le type de retour peut être n'importe quoi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X