C# et tableaux d'objets anonymes

que signifie une telle expression?

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: nouveau {Text = "IIS 7"... }

Comment puis-je créer un tableau comme celui-ci manuellement pour convenir à cette source de données.

39
demandé sur Nicholas 2010-01-10 00:24:37

6 réponses

ce n'est pas un tableau multidimensionnel. C'est un tableau d'objets qui ont été créés en utilisant initialisateurs d'objets avec des types anonymes.

37
répondu Mark Byers 2010-01-09 21:27:10

tout d'Abord, laissez reformater ce 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 d'un anonyme de type, créé et initialisé en utilisant new { ... }.

concernant votre question comment vous pouvez créer manuellement un tel tableau pour convenir à la source de données: vous semblez faire exactement cela avec le code ci-dessus.

53
répondu stakx 2017-05-23 12:26:20

Ressemble à un tableau de types anonymes.

http://msdn.microsoft.com/en-us/library/bb397696.aspx

4
répondu Kris Krause 2010-01-09 21:28:32

C'est d'en faire 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 dans say php le ferait, mais plutôt un objet réel avec les propriétés Test, Count, et Link set.

un bon abécédaire pour les objets anonymes peut être trouvé ici

vous devriez pouvoir utiliser la même syntaxe pour créer de nouvelles structures comme celle-ci, les valeurs des propriétés n'ont pas à être constantes:

string text = "Azure";
int count = 13;
string link =  "?Tag=Azure";
new {Text = text, Count = count, Link=link }
2
répondu anq 2010-01-09 21:51:43

juste pour ajouter: les types anonymes sont convertis par le compilateur en un objet réel. Ainsi, le code sera changé en quelque chose d'équivalent (très simplifié, seulement 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 modifié pour:

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 un de mes programmes, j'ai un code comme celui-ci (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);
}

Ceci fonctionne parce que c'est juste une autre classe (j'ai même IntelliSense) en coulisses. Le l'avantage est évidemment que je viens de me sauver de la création d'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 anonymous si vous en ajoutez/en supprimez)

2
répondu Michael Stum 2010-01-10 10:28:02

Pour retourner un tableau à partir d'une fonction que j'ai utilisé:

public object GetAnonymousArray()
{
    var tbl = new List<object>();
    while (___)
    {
        //fill array in cycle
        tbl.Add(new {Text = someString, Count = someInt, Link = link});
    }  
    return tbl;
}
1
répondu tga 2015-03-16 04:28:30