2017-10-19 62 views
1

可能是愚蠢的问题,但我想初始化我的对象的数组是这样的:阵列像初始化类C#

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

其中FooBar的是:

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

我试过继承CollectionBase并添加Add(字符串)方法或字符串[]运算符,但这些都不起作用:/

+0

Ofc词典的工作原理是这样的: Dictionary dic = new Dictionary (){{“foo”,“bar”}}; – blackmaciek

+0

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

+0

如果您已经转化了一个FooBars数组,那么您还需要使用FooBars的实例来填充它,所以你将不得不做'新的Foobar()',然后填写'foo'和'bar'属性。但更好的方法是将它们传递给FooBar构造函数。此外,如果您想使用字符串对,请考虑使用字典。 – pkanev

回答

0

你可以欺骗一个有点给人类FooBar的隐式构造函数(需要的元组支持最新版本的C#):

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 }; 
    } 
} 

然后,像这样的代码将工作:

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

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

然后:

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

这似乎相当接近你的目标是什么了(尽管有括号,而不是大括号)。

但通常您只需使用new FooBar("Foo", "Bar")语法作为其他答案。

+0

这有助于很多,但不是exacly我正在寻找,但看起来很酷;) – blackmaciek

+0

@ blackmaciek请注意,它不是一个非常有效的解决方案,因为您将为每个对'FooBar'构造函数的调用构造一个临时元组,如果您使用普通的'new Foobar(...)'语法。 –

4

这是你在找什么? 我不明白你在问什么。

如果您愿意,您可以在此fiddle中玩一下。

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") 
    }; 
}