En C # 3.0, vous pouvez créer une classe anonyme avec la syntaxe suivante
var o = new { Id = 1, Name = "Foo" };
Existe-t-il un moyen d'ajouter ces classes anonymes à une liste générique?
Exemple:
var o = new { Id = 1, Name = "Foo" };
var o1 = new { Id = 2, Name = "Bar" };
List<var> list = new List<var>();
list.Add(o);
list.Add(o1);
Un autre exemple:
List<var> list = new List<var>();
while (....)
{
....
list.Add(new {Id = x, Name = y});
....
}
c#
.net
generics
anonymous-types
DHornpout
la source
la source
new[] { new{ Id = (int?)null, Name = "Foo" }, new { Id = (int?)1, Name = "Foo" }}
Réponses:
Vous pourriez faire:
Il existe de nombreuses façons de dépouiller ce chat, mais en gros, ils utiliseront tous l'inférence de type quelque part - ce qui signifie que vous devez appeler une méthode générique (éventuellement comme méthode d'extension). Un autre exemple pourrait être:
Vous avez eu l'idée :)
la source
Voici la réponse.
la source
string.Join
et une interpolation de chaîne, donc pas besoin d'utiliserforeach
etFormat
.Il existe plusieurs façons de le faire, mais certaines des réponses ici créent une liste qui contient des éléments inutiles, ce qui vous oblige à effacer la liste.
Si vous recherchez une liste vide de type générique, utilisez une sélection par rapport à une liste de tuples pour créer la liste vide. Aucun élément ne sera instancié.
Voici le one-liner pour créer une liste vide:
Ensuite, vous pouvez y ajouter en utilisant votre type générique:
Comme alternative, vous pouvez faire quelque chose comme ci-dessous pour créer la liste vide (Mais, je préfère le premier exemple parce que vous pouvez également l'utiliser pour une collection remplie de Tuples):
la source
Enumerable.Empty<object>().Select(o=>definition).ToList()
Pas exactement, mais vous pouvez dire
List<object>
et les choses fonctionneront. Cependant,list[0].Id
ne fonctionnera pas.Cela fonctionnera à l'exécution en C # 4.0 en ayant un
List<dynamic>
, c'est-à-dire que vous n'obtiendrez pas IntelliSense.la source
j'imagine
marchera.
Vous pourriez également envisager de l'écrire comme ceci:
la source
J'utilise habituellement ce qui suit; principalement parce que vous "commencez" avec une liste vide.
Dernièrement, je l'ai écrit comme ceci à la place:
L'utilisation de la méthode de répétition vous permettrait également de faire:
..qui vous donne la liste initiale avec le premier élément déjà ajouté.
la source
Vous pouvez le faire dans votre code.
la source
Dans la dernière version 4.0, peut utiliser dynamique comme ci-dessous
la source
J'ai vérifié l'IL sur plusieurs réponses. Ce code fournit efficacement une liste vide:
la source
IEnumerable
, tandis que ma version revientList
, exactement ce que OP a demandé.new object[] { }.Select(o => new { Id = default(int), Name = default(string) }).ToList()
Voici ma tentative.
Je suis venu avec cela quand j'ai écrit quelque chose de similaire pour faire une liste anonyme pour un type personnalisé.
la source
Vous pouvez créer une liste de dynamiques.
"dynamique" est initialisé par la première valeur ajoutée.
la source
Au lieu de cela:
Vous pouvez faire ceci:
Cependant, vous obtiendrez une erreur de temps de compilation si vous essayez de faire quelque chose comme ça dans une autre étendue, bien que cela fonctionne à l'exécution:
Le problème est que seuls les membres d'Object sont disponibles au moment de l'exécution, bien qu'intellisense affiche l' ID et le nom des propriétés .
Dans .net 4.0, une solution consiste à utiliser le mot clé istead dynamique d' objet dans le code ci-dessus.
Une autre solution consiste à utiliser la réflexion pour obtenir les propriétés
la source
Voici une autre méthode de création d'une liste de types anonymes qui vous permet de commencer avec une liste vide, tout en ayant accès à IntelliSense.
Si vous souhaitez conserver le premier élément, mettez simplement une lettre dans la chaîne.
la source
la source
C'est une vieille question, mais je pensais que je mettrais ma réponse C # 6. Je dois souvent configurer des données de test qui sont facilement saisies dans le code sous forme de liste de tuples. Avec quelques fonctions d'extension, il est possible d'avoir ce joli format compact, sans répéter les noms sur chaque entrée.
Cela donne un IEnumerable - si vous voulez une liste que vous pouvez ajouter, ajoutez simplement ToList ().
La magie vient des méthodes d'ajout d'extensions personnalisées pour les tuples, comme décrit sur https://stackoverflow.com/a/27455822/4536527 .
}
La seule chose que je n'aime pas, c'est que les types sont séparés des noms, mais si vous ne voulez vraiment pas créer une nouvelle classe, cette approche vous permettra toujours d'avoir des données lisibles.
la source
Je suis très surpris que personne n'ait suggéré d'initialisation de collection. Cette façon ne peut ajouter des objets que lorsque la liste est créée, d'où le nom, mais cela semble être la meilleure façon de le faire. Pas besoin de créer un tableau puis de le convertir en liste.
Vous pouvez toujours utiliser
object
au lieu de,dynamic
mais essayer de le garder d'une manière générique véritable a alorsdynamic
plus de sens.la source
Vous pouvez le faire de cette façon:
Cela me semble un peu "hacky", mais cela fonctionne - si vous avez vraiment besoin d'avoir une liste et que vous ne pouvez pas simplement utiliser le tableau anonyme.
la source
Pour votre deuxième exemple, où vous devez initialiser un nouveau
List<T>
, une idée est de créer une liste anonyme, puis de l'effacer.Ou comme méthode d'extension, devrait être plus facile:
Ou probablement encore plus court,
la source
Si vous utilisez C # 7 ou supérieur, vous pouvez utiliser des types de tuple au lieu de types anonymes.
la source
Dérivant de cette réponse , j'ai trouvé deux méthodes qui pourraient faire la tâche:
Vous pouvez utiliser les méthodes comme
Cette réponse a une idée similaire, mais je ne l'ai vue qu'après avoir fait ces méthodes.
la source
Essayez avec ceci:
la source
la source