Inicializando una matriz de estructuras en C #

¿Cómo puedo inicializar una matriz constante / estática de estructuras lo más claramente posible?

class SomeClass { struct MyStruct { public string label; public int id; }; const MyStruct[] MyArray = { {"a", 1} {"b", 5} {"q", 29} }; }; 

En primer lugar, ¿ realmente tienes que tener una estructura mutable? Ellos son malvados Del mismo modo, campos públicos.

Aparte de eso, solo crearía un constructor tomando los dos bits de datos:

 class SomeClass { struct MyStruct { private readonly string label; private readonly int id; public MyStruct (string label, int id) { this.label = label; this.id = id; } public string Label { get { return label; } } public string Id { get { return id; } } } static readonly IList MyArray = new ReadOnlyCollection (new[] { new MyStruct ("a", 1), new MyStruct ("b", 5), new MyStruct ("q", 29) }); } 

Tenga en cuenta el uso de ReadOnlyCollection en lugar de exponer la matriz en sí, esto lo hará inmutable, evitando el problema de exposición de matrices directamente . (El progtwig de códigos inicializa una matriz de estructuras; pasa la referencia al constructor de ReadOnlyCollection<> ).

¿Estás usando C # 3.0? Puede usar los inicializadores de objetos de esta manera:

 static MyStruct[] myArray = new MyStruct[]{ new MyStruct() { id = 1, label = "1" }, new MyStruct() { id = 2, label = "2" }, new MyStruct() { id = 3, label = "3" } }; 

No puede inicializar tipos de referencia por defecto que no sean null. Tienes que hacerlos de solo lectura. Entonces esto podría funcionar;

  readonly MyStruct[] MyArray = new MyStruct[]{ new MyStruct{ label = "a", id = 1}, new MyStruct{ label = "b", id = 5}, new MyStruct{ label = "c", id = 1} }; 

Cambia const a static readonly e inicialízalo así

 static readonly MyStruct[] MyArray = new[] { new MyStruct { label = "a", id = 1 }, new MyStruct { label = "b", id = 5 }, new MyStruct { label = "q", id = 29 } }; 

Usaría un constructor estático en la clase que establece el valor de una matriz de solo lectura estática.

 public class SomeClass { public readonly MyStruct[] myArray; public static SomeClass() { myArray = { {"foo", "bar"}, {"boo", "far"}}; } }