2017-10-19 17 views
1

peut être question stupide, mais je voudrais initialiser mon tableau d'objets comme celui-ci:tableau comme classe d'initialisation C#

FooBar[] fooBars = new FooBars[] 
{ 
    {"Foo", "Bar"}, 
    {"Foo", "Bar"} 
}; 

où FooBar est:

public class FooBar 
{ 
    public string foo; 
    public string bar; 
} 

J'ai essayé Hériter de CollectionBase et ajouter la méthode Add (string), ou l'opérateur string [], mais aucun de ces travaux:/

+0

Les dictionnaires Ofc fonctionnent comme suit: Dictionnaire dic = new Dictionary () {{"foo", "bar"}}; – blackmaciek

+0

https://msdn.microsoft.com/en-us/library/83h9yskw(v=vs.110).aspx –

+0

Si vous avez décalé un tableau de FooBars, vous devez également le remplir avec des instances de FooBars, donc vous devriez faire 'new Foobar()', puis remplir les propriétés 'foo' et' bar'. Cependant, un meilleur moyen serait de passer ceux dans le constructeur FooBar. De plus, si vous voulez utiliser une paire de chaînes, pensez à utiliser un dictionnaire. – pkanev

Répondre

0

Vous pouvez tricher un peu en donnant la classe FooBar un constructeur implicite (nécessite la plus récente version de C# pour le soutien de tuple):

public class FooBar 
{ 
    public string foo; 
    public string bar; 

    public static implicit operator FooBar((string, string) init) 
    { 
     return new FooBar{ foo = init.Item1, bar = init.Item2 }; 
    } 
} 

Alors code comme ceci fonctionnera:

var fooBars = new FooBar[] 
{ 
    ("Foo1", "Bar1"), 
    ("Foo2", "Bar2") 
}; 

OU

FooBar[] fooBars = 
{ 
    ("Foo1", "Bar1"), 
    ("Foo2", "Bar2") 
}; 

Et puis:

foreach (var fooBar in fooBars) 
    Console.WriteLine($"foo = {fooBar.foo}, bar = {fooBar.bar} "); 

qui semble assez proche de ce que vous visez pour (mais avec des parenthèses au lieu d'accolades).

Mais normalement vous utiliseriez simplement la syntaxe new FooBar("Foo", "Bar") comme pour l'autre réponse.

+0

Cela aide beaucoup, pas exactement ce que je cherchais, mais a l'air cool;) – blackmaciek

+0

@ blackmaciek Veuillez noter que ce n'est pas une solution très efficace, car vous construisez un tuple temporaire pour chaque appel au constructeur 'FooBar', ce qui ne serait PAS nécessaire si vous utilisez la syntaxe normale' new Foobar (...) ' . –

4

Est-ce-ce que vous cherchez? Je ne comprends pas exactement ce que vous demandez. Vous pouvez jouer un peu avec cet fiddle si vous voulez.

public class FooBar 
{ 
    public FooBar(string foo, string bar) 
    { 
     this.foo = foo; 
     this.bar = bar; 
    } 

    public string foo; 
    public string bar; 
} 

public static void Main(String[] args) 
{ 
    FooBar[] fooBars = new FooBar[] { 
     new FooBar("Foo", "Bar"), 
     new FooBar("Foo", "Bar") 
    }; 
}