2010-01-09 10 views
31

¿Qué significa tal expresión?C# y matrices de objetos anónimos

obj.DataSource = new[] 
{ 
    new {Text = "Silverlight", Count = 10, Link="/Tags/Silverlight" }, 
    new {Text = "IIS 7", Count = 11, Link="http://iis.net" }, 
    new {Text = "IE 8", Count = 12, Link="/Tags/IE8" }, 
    new {Text = "C#", Count = 13, Link="/Tags/C#" }, 
    new {Text = "Azure", Count = 13, Link="?Tag=Azure" } 
}; 

Especialmente estas líneas: {nuevo texto = "IIS 7" ...}

¿Cómo puedo crear una matriz como esto manualmente de acuerdo a esta fuente de datos.

+1

Por ahora creo que es seguro cambiar el título de la pregunta de "C# multidimensional array "a algo más apropiado que involucre" array of anonymous objects "o algo así. – Zano

Respuesta

45

En primer lugar, vamos a volver a formatear that code un poco:

obj.DataSource = new[] 
{ 
    new { Text = "Silverlight", Count = 10, Link = "/Tags/Silverlight" }, 
    new { Text = "IIS 7",  Count = 11, Link = "http://iis.net"  }, 
    new { Text = "IE 8",   Count = 12, Link = "/Tags/IE8"   }, 
    new { Text = "C#",   Count = 13, Link = "/Tags/C#"   }, 
    new { Text = "Azure",  Count = 13, Link = "?Tag=Azure"   } 
}; 

Esto no se ve como una matriz multidimensional, sino más bien como una serie de 5 objetos. Estos objetos dentro de la matriz son de anonymous type, creados e inicializados usando new { ... }.

Con respecto a su pregunta sobre cómo puede crear manualmente una matriz de este tipo para adaptarse a la fuente de datos: parece que está haciendo exactamente eso con el código anterior.

+3

Respuesta correcta como otras. +1 para alentar el formato correcto. –

+0

Usted, señor, usa el formateo de los reyes. (Bueno, excepto que necesitas espacios entre los signos de = para la palabra 'Lin'). Sin embargo, puedo perdonar eso como un accidente. El formato adecuado reduce en gran medida los errores y aumenta la legibilidad trivial. –

+0

Gracias, amable señor. :) Sí, olvidé los espacios alrededor de =. Se agregan ahora. – stakx

2

Está haciendo una nueva matriz de objetos, que contiene un grupo de objetos anónimos.

new {Text = "Azure", Count = 13, Link="?Tag=Azure" } 

no está creando un hash como una sintaxis similar en php decir lo haría, pero en lugar de bienes por un objeto real con las propiedades de prueba, contar y conjunto de enlaces.

Un buen manual para objetos anónimos se puede encontrar here

Usted debe ser capaz de utilizar la misma sintaxis para crear nuevas estructuras de este tipo, los valores de las propiedades no tienen que ser constantes:

string text = "Azure"; 
int count = 13; 
string link = "?Tag=Azure"; 
new {Text = text, Count = count, Link=link } 
1

para devolver una matriz tal partir de una función utilicé:

public object GetAnonymousArray() 
{ 
    var tbl = new List<object>(); 
    while (___) 
    { 
     //fill array in cycle 
     tbl.Add(new {Text = someString, Count = someInt, Link = link}); 
    } 
    return tbl; 
} 
2

sólo para añadir: los tipos anónimos son convertidos por el compilador para una objeto real Por lo que el código se cambia a algo equivalente a esto (muy simplificado, sólo para demostrar que el compilador creará una clase real):

internal sealed class AnonymousClass1 
{ 
    internal string Text { get; set; } 
    internal int Count { get; set; } 
    internal string Link { get; set; } 
} 

y su código se cambiará entonces a:

obj.DataSource = new AnonymousClass1[] 
{ 
    new AnonymousClass1 {Text = "Silverlight", Count = 10, Link="/Tags/Silverlight" }, 
    new AnonymousClass1 {Text = "IIS 7", Count = 11, Link="http://iis.net" }, 
    new AnonymousClass1 {Text = "IE 8", Count = 12, Link="/Tags/IE8" }, 
    new AnonymousClass1 {Text = "C#", Count = 13, Link="/Tags/C#" }, 
    new AnonymousClass1 {Text = "Azure", Count = 13, Link="?Tag=Azure" } 
}; 

En uno de mis programas, que tienen código como este (simplificado!):

var myObjects = new []{ 
    new { Id = Guid.NewGuid(), Title = "Some Title", Description = string.Empty }, 
    new { Id = Guid.NewGuid(), Title = "Another Title", Description = string.Empty }, 
    new { Id = Guid.NewGuid(), Title = "Number 3", Description = "Better than No2, but not much" } 
} 

foreach(var myObject in myObjects) { 
    DoSomeThingWith(myObject.Title); 
} 

esto funciona porque es simplemente otra clase (incluso consigo IntelliSense) detrás de las escenas. El beneficio es obviamente que me salvé de crear una clase para este objeto. En mi ejemplo, todos los objetos deben tener el mismo aspecto también.(Obviamente, hacer esto para cualquier miembro público sería una mala idea ya que el compilador podría cambiar el nombre de la clase anónima si agrega/elimina algo)