Type anonyme collections?
Je suis à la recherche pour les meilleures pratiques pour la création de collections de types anonymes.
Il existe plusieurs approches - cette et la plupart des réponses sur cette fil supposer que l'ensemble de la collecte anonyme peut être construit en une seule instruction.
Que les types anonymes sont généralement utilisées pour remplacer les classes qui doivent être utilisés pour le stockage temporaire (tel que mis de l'avant dans cette SORTE de réponse), je voudrais éviter de créer et d'utiliser une classe anonyme pour les collections, comme ce post suggère.
Dans mon cas, je suis une itération sur une collection - pour chaque élément de la collection, je voudrais recueillir des objets d'un type anonyme (agissant comme un n-uplet). J'ai besoin de ces types anonymes à être placé dans une collection, puis de les trier pour la poursuite des travaux.
D'autres approches que j'ai considéré comme:
- Utiliser un objet[] ou ArrayList (perdant ainsi le bénéfice du type anonyme)
- La création d'une classe wrapper pour les éléments requis (en supprimant la nécessité pour le type anonyme)
C'est le seul endroit dans mon code que j'ai besoin d'une telle collection - quelle serait la meilleure approche?
Informations Supplémentaires:
Je suis en train de travailler avec les anciens .Net 1.1 objet, de sorte que les collections, je travaille avec sont fortement typés collections de la mise en œuvre de IEnumerable, et en tant que tel, la plupart d'extension Linq des méthodes telles que .Sélectionnez ne fonctionne pas:
Exemple de Code
foreach (Item item in myItems)
{
foreach (Confirmation confirmation in item.GetConfirmations(true))
{
if (lastParentId != item.ParentId)
{
lastParentId = item.ParentId;
parentObject = new ParentItem(lastParentId);
}
itemHolder = new ArrayList { item, confirmation };
if (parentObject!= null)
{
itemHolder.Add(parentObject.Rate);
}
sortConfirmations.Add(confirmation.Date, itemHolder);
}
}
//Use sortConfirmations
Résolution
J'ai fini à l'aide d'un dictionnaire générique pour recueillir les éléments connexes et l'utilisation .OrderBy() pour trier eux - moche, mais ça marche... et c'est mieux que le code existant.
OriginalL'auteur Oded | 2009-03-19
Vous devez vous connecter pour publier un commentaire.
Pour un de très différent de réponse... LINQ?
Qui sonne comme:
c'est souvent encore possible. Bien sûr, il est difficile de dire pour sûr, sans un exemple concret...
+1 pour le "nous avons besoin de plus d'informations". Je soupçonne fortement que LINQ est la voie à suivre ici.
Il a aidé. Merci
OriginalL'auteur Marc Gravell
Si vous êtes heureux avec un tableau, vous pouvez utiliser un initialiseur de tableau:
Vous pouvez ensuite appeler
ToList()
si vous voulez obtenir unList<T>
. Marc solution sera un peu plus efficace que d'appelerToList()
en raison de ne pas avoir besoin supplémentaire de la copie, mais je pense je serais probablement utiliser le "tableau et puis ToList()" de la solution dans la plupart des cas, car il y a moins d'encombrement. Bien sûr, si la performance est cruciale pour ce bout de code, ça change les choses.EDIT: Comme vous êtes une itération sur une collection, il suffit d'utiliser
Select
:Une petite astuce: les tables sont en lecture seule, donc si vous utilisez cette méthode d'envisager la convocation d'
.ToList()
à produire une écriture de la collection. Ce qui est très pratique dans une unité de scénarios de test pour des choses telles que l'extension des méthodes.OriginalL'auteur Jon Skeet
Une option est d'utiliser un exemple d'élément pour créer la collection par le biais générique de l'inférence de type, par exemple:
Vous pouvez également le faire sans la création d'une instance (mais en utilisant une méthode anonyme, qui n'est jamais de l'appelant), mais je ne pense pas qu'il sauve quelque chose de vraiment... on pourrait pas créer une instance de l'objet, mais nous n'avons créer une instance d'un délégué, donc pas beaucoup d'une économie...
Vous avez également mentionné le tri des données; voir la répondre ici un moyen d'utiliser
List<T>.Sort
avec un lambda, et donc avec les types anonymes - c'est à direOriginalL'auteur Marc Gravell
LINQ est le chemin à parcourir. En supposant que vous souhaitez récupérer les objets associés A, B et C de chaque élément dans une collection d'éléments et de les trier par l'objet d'Une vous irait comme suit.
Vous obtenez une collection d'éléments d'un type anonyme avec les trois propriétés A, B et C ensemble des objets commandés par l'objet A.
Je n'ai pas vérifier, mais vous devriez être en mesure de prolonger la relatedObject la collection plus tard. Juste faire ce qui suit pour ajouter un nouvel élément. Cela devrait fonctionner car il n'existe qu'un type anonyme par l'assemblée, je pense que si les noms et les types de chaque correspondance de la propriété.
Assez moche à cause de la Énumérable.Répéter (), mais devient très agréable, si vous avez de l'union avec une collection de nouveaux éléments au lieu d'un seul nouvel élément.
OriginalL'auteur Daniel Brückner
Je suis tombé sur cette question tout en cherchant un moyen de créer une liste temporaire des objets temporaires.
Pourquoi aurais-je veux créer une telle chose? Je cherchais un moyen rapide de retour JSON pour une liste d'objets fabriqués à partir de certaines valeurs d'un autre objet. Voici ce que je veux dire.
Supposons que j'ai une classe d'Employés sur le côté serveur qui se présente comme suit en C#:
En outre, j'ai une collection de ces objets que j'ai peut facilement parcourir, quelque chose comme ce qui suit:
Maintenant, je veux revenir à mon appel de la page web de la ensemble de la collection des Employés, mais je voulez seulement le firstName, lastName pour chaque. Je veux restituer sous forme de JSON.
Voici Le Point Important
Je ne veux pas retourner tous les biens de l'Objet Employé.
Je sais que je peux facilement créer un type anonyme en parcourant la allEmployees de la collecte et de la construction d'un nouvel objet à chaque fois.
Il ressemblerait à quelque chose comme ce qui suit:
Quel est Le Type D'Un Type Anonyme? 🙂
Le truc maintenant c'est que je veux un ensemble de la collection (Liste<>)de ces objets anonymes.
Cependant, je n'ai aucun moyen de vous fournir la Liste un type que je vais utiliser. Je ne peux pas créer un
List<unknown> allTempObjects = new List<unknown>();
Ou puis-je?
Dynamique, Il Est Possible
Je peux faire la suite et il fonctionne très bien:
Vous verrez JSON sur le côté client qui se présente comme suit:
Enfin, vous pouvez poser la question pourquoi je veux faire ce. La réponse simple est que je veux d'un type nouveau qui est seulement utilisé pour sérialiser à envoyer à mon client. Une bonne raison pour un type anonyme et une collecte anonyme des types anonymes, vous ne pensez pas?
OriginalL'auteur raddevus
Oui, vous l'habitude de créer une collection de type anonyme en une seule instruction. Si vous avez besoin de plus d'états, vous pouvez vous retrouver avec une assez inutile collection de différents types anonymes.
Les types anonymes sont utiles lorsque vous les créez en une seule instruction, et de les utiliser immédiatement. Si la création de la collection ou de la poursuite du traitement est un peu plus complexe, de l'anonyme de type perd un peu de son utilité. Par exemple, vous ne pouvez pas passer efficacement un type anonyme le long d'une méthode pour le traitement, la méthode ne connais pas le type de l'objet et donc avoir à utiliser la réflexion pour obtenir quoi que ce soit.
Si vous allez à plusieurs reprises chercher les articles dans cette collection de types anonymes, vous pouvez créer un nom de type, de sorte que vous pouvez les mettre dans un Dictionnaire pour beaucoup plus rapidement de recherche.
Gravel: Oui, bien sûr, vous avez besoin de quelque chose comme une Liste<object> traiter les deux types, perdre la connexion directe à l'anonyme de type d'information.
OriginalL'auteur Guffa