2010-01-09 4 views
31

Que signifie une telle expression?C# et tableaux d'objets anonymes

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

Surtout ces lignes: nouvelle {Text = "IIS 7" ...}

Comment puis-je créer un tableau comme celui-ci manuellement en fonction de ce DataSource.

+1

Maintenant, je pense qu'il est sûr de changer le titre de la question de "C# multidimensionnel tableau "à quelque chose de plus approprié impliquant" tableau d'objets anonymes "ou un tel. – Zano

Répondre

45

Tout d'abord, nous allons reformater that code un peu:

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

Cela ne ressemble pas à un tableau multidimensionnel, mais plutôt comme un tableau de 5 objets. Ces objets à l'intérieur du tableau sont anonymous type, créés et initialisés à l'aide de new { ... }. En ce qui concerne votre question comment vous pouvez créer manuellement un tel tableau en fonction de la source de données: vous semblez faire exactement cela avec le code ci-dessus.

+3

Bonne réponse comme les autres. +1 pour encourager le bon formatage –

+0

Vous, monsieur, utilisez le formatage des rois. (Eh bien, sauf que vous avez besoin d'espaces entre les signes = pour le mot «Lin»). Néanmoins, je peux pardonner cela comme un accident. Un formatage approprié réduit considérablement les erreurs et augmente la lisibilité. –

+0

Merci, monsieur. :) Oui, j'ai oublié les espaces autour du =. Ils sont ajoutés maintenant. – stakx

2

Il crée un nouveau tableau d'objets contenant un groupe d'objets anonymes.

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

ne crée pas un hachage comme une syntaxe similaire à dire php serait, mais réelle d'un objet réel avec les propriétés de test, le comte, et ensemble Link.

Une bonne introduction pour les objets anonymes se trouve here

Vous devriez être en mesure d'utiliser la même syntaxe pour créer de nouvelles structures comme celle-ci, les valeurs de propriété ne doivent pas être constantes:

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

pour revenir un tel tableau d'une fonction je:

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

Juste pour ajouter: les types anonymes sont convertis par le compilateur à un vrai objet. Ainsi, le code sera changé pour quelque chose d'équivalent de ce (très simplifié, pour montrer que le compilateur va créer une classe réelle):

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

Et votre code sera alors changé:

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

Dans l'un de mes programmes, j'ai le code comme ceci (simplifié!):

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

cela fonctionne parce qu'elle est juste une autre classe (je reçois même IntelliSense) dans les coulisses. L'avantage est évidemment que je me suis juste sauvé de créer une classe pour cet objet. Dans mon exemple, tous les objets doivent avoir la même apparence.(Évidemment, faire cela pour n'importe quel membre du public serait une mauvaise idée car le compilateur pourrait changer le nom de la classe anonyme si vous en ajoutez/en supprimez)