Liste de Listes de types différents
L'une des structures de données dans mon projet actuel, je dois stocker des listes de types divers (String, int, float, etc.). - Je besoin pour pouvoir stocker un nombre quelconque de listes sans savoir ce que les types qu'ils seront.
J'ai essayé le stockage de chaque liste en tant que object
, mais j'ai couru dans des problèmes en essayant de jeter en arrière dans le type approprié (elle a gardé reconnaissant tout comme un List<String>
).
Par exemple:
List<object> myLists = new List<object>();
public static void Main(string args[])
{
//Create some lists...
//Populate the lists...
//Add the lists to myLists...
for (int i = 0; i < myLists.Count; i++)
{
Console.WriteLine("{0} elements in list {1}", GetNumElements(i), i);
}
}
public int GetNumElements(int index)
{
object o = myLists[index];
if (o is List<int>)
return (o as List<int>).Count;
if (o is List<String>) //<-- Always true!?
return (o as List<String>).Count; //<-- Returning 0 for non-String Lists
return -1;
}
Je fais quelque chose de mal? Est-il une meilleure façon de stocker une liste de listes de types différents, ou est-il une meilleure façon de déterminer si quelque chose est une liste d'un certain type?
OriginalL'auteur themarshal | 2010-03-19
Vous devez vous connecter pour publier un commentaire.
Le type
List<T>
hérite de la non-interface génériqueIList
. Depuis toutes les valeurs dans lamyList
type sont liés intsance deList<T>
vous pouvez les utiliser comme de la non-génériqueIList
. Donc vous pouvez l'utiliser afin de simplifier grandement votre logiqueOu, alternativement, puisque vous savez que toutes les valeurs stockées dans
myList
sera lié version deList<T>
, utilisezIList
que le type au lieu deobject
.IList
est?non, pas vraiment. La seule façon de vraiment vérifier est d'utiliser le "comme" opérateur de cast pour les types pris en charge et les manipuler
J'ai enfin trouvé un moyen de garder une trace du type de liste comme il était inséré. La raison de tout gardé se lire comme une Chaîne de la liste parce que quand j'étais en train de créer des listes en fonction de leur type, le type "Entier" a été, à tort, générant une Liste<String>. Oups!
OriginalL'auteur JaredPar
Je sais que c'est un oldy, mais .NET 4 nous a donné une autre façon de contourner ce problème.
Que faire si vous voulez une Liste où X est une autre Liste, et y est de tout type à tous?
En d'autres termes, une Liste> vous pouvez essayer de l'objet, mais alors il faudrait toujours être en train de jeter quelque chose en retour à son type d'origine, comme ci-dessus.
Donc, ce est l'un des rares cas où la nouvelle dynamique de type de données peut être utilisé.
Bien sûr, il vous permettra de vous échapper de sécurité de type, mais dans ce cas, comme nous sommes toujours en passant pour être face à une liste d'une certaine sorte, qu'il est juste de dire qu'elle va avoir un ".Le comte de la propriété".
Donc quelque chose comme :
Donc à l'aide d'dynamique nous permet de supprimer le type des contrôles de sécurité. Beaucoup de développeurs sont contre l'utilisation de la dynamique. J'ai effectivement décidé de rechercher activement quelque chose au sujet d'une liste de listes de types différents, et il est venu ici. J'ai donc ajouté mon propre solution à mon problème. il est effectivement utilisé comme une liste de données de test, où une liste externe de l'os d'une liste de noms de paramètre, et une collection 9inner liste) des valeurs à utiliser dans les tests. Ceux-ci sont différents par paramètre, et je ne voulais pas constamment acteurs de l'objet à des types que je connais de cours de code source de la création. J'ai trouvé ceci pour être une solution pratique.
OriginalL'auteur Simon Miller