278 votes

c # Liste des acteurs <X> lister <Y>

Je sais qu'il est possible de convertir une liste d'éléments d'un type à un autre (étant donné que votre objet dispose d'une méthode d'opérateur explicite statique publique pour effectuer la conversion), l'un après l'autre, comme suit:

 List<Y> ListOfY = new List<Y>();

foreach(X x in ListOfX)
    ListOfY.Add((Y)x);
 

Mais n'est-il pas possible de lancer toute la liste en même temps? Par exemple,

 ListOfY = (List<Y>)ListOfX;
 

594voto

Jamiec Points 35773

Si X peut réellement être converti en Y vous devriez pouvoir utiliser

 List<Y> listOfY = listOfX.Cast<Y>().ToList()
 

111voto

SWeko Points 17524

Le direct cast var ListOfY = (List<Y>)ListOfX n'est pas possible, car cela exigerait co/contravariance de l' List<T> type, et que tout ne peut pas être garantie dans tous les cas. Veuillez lire la suite pour voir les solutions à ce casting problème.

Alors qu'il semble normal d'être capable d'écrire du code comme ceci:

List<Animal> animals = (List<Animal>) mammalList;

parce que nous pouvons garantir que tous les mammifères seront un animal, ce qui est évidemment une erreur:

List<Mammal> mammals = (List<Mammal>) animalList;

depuis pas chaque animal est un mammifère.

Cependant, à l'aide de C# 3 et ci-dessus, vous pouvez utiliser

IEnumerable<Animal> animals = mammalList.Cast<Animal>();

qui facilite le casting un peu. C'est syntaxiquement équivalent à celui de votre un par un ajout de code, car il utilise un cast explicite cast chaque Mammal dans la liste à un Animal, et échoue si le casting n'est pas réussi.

Si vous voulez plus de contrôle sur la coulée / le processus de conversion, vous pouvez utiliser l' ConvertAll méthode de List<T> classe, qui peut utiliser une expression à convertir les éléments. Il a ajouté l'avantage qu'il renvoie une List, au lieu de IEnumerable, donc pas de .ToList() est nécessaire.

List<object> o = new List<object>();
o.Add("one");
o.Add("two");
o.Add(3);

IEnumerable<string> s1 = o.Cast<string>(); //fails on the 3rd item
List<string> s2 = o.ConvertAll(x => x.ToString()); //succeeds

8voto

Andrey Points 404

Vous pouvez utiliser List.ConvertAll ([Convertisseur de Y en T]);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X