9
votes

Comment lancer des listes génériques de manière dynamique en C #?

J'essaie de lancer Liste à Liste de manière dynamique. J'ai essayé plusieurs manières, mais je ne trouve pas de solution. Ceci est un petit échantillon qui montre le problème: xxx

merci d'avance!


1 commentaires

Cela ne sera pas possible dans la version 4 non plus, car ce n'est pas TypeAsafe de «Upcast» ou «Downcast» a Liste - C'est invariant, pas covariant ou contravaret. Au fait, je suis fatigué de cette désinformation affectée à toutes les questions concernant la collecte CO / Contravariance.


6 Réponses :


18
votes

Si vous pouvez utiliser LINQ, alors le couler < / a> méthode fera ce dont vous avez besoin: xxx

Vous pouvez également utiliser le convertiall méthode, comme Stan pointe dans sa réponse: xxx

si vous n'utilisez pas C # 3 Ensuite, vous devrez utiliser l'ancienne syntaxe de déléguée plutôt qu'une lambda: xxx


2 commentaires

@nader: J'essaie toujours de me rappeler que lorsque Linq n'est pas disponible, alors la syntaxe Lambda.


Et juste pour préempter les nitpickers ... Je suis conscient que VS2008 peut cibler des versions antérieures de la structure .NET, qui permettrait l'utilisation de la syntaxe Lambda mais non linq. Mais, en tant que règle de pouce, aucun Linq ne signifie généralement pas de Lambdas aussi.



4
votes

Si vous utilisez .NET 3.5, vous pouvez utiliser, de cette façon, vous n'avez pas à faire une tolorme supplémentaire (). Vous pouvez également fournir votre propre convertisseur si vous devez convertir des objets avancés.

foreach(object item in listObject)
{
  string convertedItem = item as String;
  if(convertedItem != null)
       listString.Add(convertedItem);
}


7 commentaires

Ceci est également pris en charge dans .NET 2.0 (sans linq, bien que la syntaxe Delgate ne soit pas aussi belle). Une note cependant, je ne crois pas que le .Cast .tolist () créera une liste "extra" que vous impliquez. Il créera une nouvelle liste, pour le résultat, de même que votre approche


Je pense que vous voulez dire C # 3.0 et .NET 3.5.


@nader: J'impliquais que Tolist () fait une énumération supplémentaire.


@Stan: Êtes-vous sûr? Tolist () provoquera une énumération, mais c'est tout. Cast () ne énumérera pas la collection.


@Nader: Je suis à peu près sûr que je sois énumère une fois d'exécuter la distribution sur chaque objet puis de tolérer une autre énumération que je crois (cela appelle-t-il la copie)


@Stan: la méthode couler renvoie simplement un objet itérateur qui ne fait rien avant de commencer à énumérer la séquence (avec Tolist , foreach ), A quel point il jette et diffuse un élément à la fois. La séquence n'est énumérée qu'une seule fois.


@Stan: Cela dit, bien que le " couler alors tolist " approche et la approche convertall énumère la séquence une fois, je Attendez-vous à ConvertiLL Pour être marginalement plus rapide, car il bouge via la liste Source Liste S sous-jacent de la matrice sous-jacente directement plutôt que d'utiliser un objet itérateur. (Bien que je doute si cette différence serait perceptible dans la plupart des scénarios du monde réel.)



0
votes

Je ne pense pas que vous puissiez le faire une étape. Au lieu de cela, essayez quelque chose comme ceci: xxx


1 commentaires

C'est faux, il ne veut pas trop tôt () sur thos objet, il veut le convertir en un objet à chaîne. Techniquement, votre exemple fonctionnera cette fois, mais uniquement pour les chaînes. Mais s'il arrive de heurter un objet plus avancé, il ne pourra pas utiliser cette méthode.



0
votes
List<string> listString = (from o in listObject select (string)o).ToList();

0 commentaires

1
votes

Comment cela: xxx

Utilisation: xxx


0 commentaires

-2
votes

Mon premier message ... espérons que l'utilité semble fonctionner dans mon projet ...

                if (PropertyType == typeof(UInt32))
                {
                    List<UInt32> UInt32_test = NewProperty.ConvertList(PropertyType);
                }
                if (PropertyType == typeof(string))
                {

                    List<string> string_test = NewProperty.ConvertList(PropertyType);
                }


0 commentaires