11
votes

Utilisation de la syntaxe d'initialisateur de collection sur des types personnalisés?

J'ai une grande liste statique qui est essentiellement une table de consultation, donc j'initialiser le tableau dans le code.

private static List<LookupItem> _lookupTable = new List<LookupItem>()
{ 
    { 1, 2, 3, 4 },
    { 5, 6, 7, 8 },
    //etc
}


0 commentaires

5 Réponses :


4
votes

Vous essayez d'utiliser un initialiseur de collection sur la liste elle-même, pas sur votre type: xxx

donc il recherche un ajouter méthode avec quatre paramètres avec quatre paramètres Sur Liste , et qui n'existe pas.

Vous devriez mettre en place votre propre classe pour utiliser un initialiseur de collecte personnalisé. Pendant que vous utilisez list , vous êtes coincé avec les appels de constructeur que vous avez.


0 commentaires

15
votes

Je pense que vous devez créer une collection personnalisée au lieu de la liste. Appelez-le sur la recherche, par exemple. Donnez cette collection une méthode Ajout (int, int, flotteur, flotteur) et devez-la mettre en œuvre iEnumerable. Par exemple:

class LookupItem
{
    public int a;
    public int b;
    public float c;
    public float d;
}

class LookupItemTable : List<LookupItem>
{
    public void Add(int a, int b, float c, float d)
    {
        LookupItem item = new LookupItem();
        item.a = a;
        item.b = b;
        item.c = c;
        item.d = d;
        Add(item);
    }
}

private static LookupItemTable _lookupTable = new LookupItemTable {
    { 1, 2, 3, 4 },
    { 5, 6, 7, 8 }
};


1 commentaires

Fantastique. Merci beaucoup.



0
votes

Cela signifie-t-il que je dois mettre en œuvre iEnumerable sur ma classe de recherche et retourne chaque paramètre? Ma classe n'est pas une classe de collection cependant.

Non, cela signifie que list implémente iEnumerable , c'est pourquoi vous pouvez écrire xxx

Cela signifie également que si votre lookuptutem était une collection implémentée ienumerable , vous auriez pu écrire: xxx


0 commentaires

6
votes

correction rapide forte>: faites votre propre liste Liste code> avec un Ajouter code> surcharge qui prend plusieurs arguments:

public class Hack : IEnumerable {
    public int LuckyNumber { get; set; }
    public double Total { get; private set; }
    public void Add(string message, int operand1, double operand2, double operand3) {
        Console.WriteLine(message);
        this.Total += operand1 * operand2 - operand3;
    }
    public IEnumerator GetEnumerator() { throw new NotImplementedException(); }
}

class Program {
    static void Main(string[] args) {
        Hack h1 = new Hack() {
            { "Hello", 1, 3, 2},
            { "World", 2, 7, 2.9}
        };
        Console.WriteLine(h1.Total);
        Hack h2 = new Hack() { LuckyNumber = 42 };
        Console.WriteLine(h2.LuckyNumber);
    }
}


1 commentaires

Vous ne devriez jamais le faire dans un vrai programme - d'accord. Que devriez-vous faire dans un véritable programme? Scénario: portant de Java et avoir une classe qui a 3 ajouter () surcharges et outils ienumerable . Si j'étais implémenter icollection je vais avoir un tas de supprimer () , effacer () méthodes que je ne veux pas . Existe-t-il une autre solution pour que cela soit plus clair comment utiliser les initialisateurs de la collection à l'aide d'IntelliSense ou écrit la documentation de ma seule option?



1
votes

Plutôt que d'obscurcir l'intention de la liste avec une classe personnalisée découlant de la liste , ajoutez une extension simple qui appelle le constructeur requis: xxx

Notez que vous négociez de la clarté pour Brevity, alors utilisez vos propres risques. L'utilisation de "New ListItem" vous permet de faire du F12 directement au constructeur; Cette extension ne le fait pas (et cela ne serait-il jamais probablement évident pour les autres développeurs).


0 commentaires