2010-09-23 5 views
0

Je suis nouveau dans .NET> 22 listes dans un

J'ai

List<Dog> dogs; 
List<Cat> cats; 
List<Animal> animals; 

J'ai besoin de rejoindre dogs et cats dans animals.

Je sais qu'il devrait y avoir une manière élégante de le faire en utilisant LINQ ou des choses de .NET 4, n'est-ce pas?

Ma première variante:

animals.AddRange(dogs); 
animals.AddRange(cats); 
+1

Je suppose que nous devrions supposer que 'Animal' est une classe de base commune pour' Dog' et 'Cat'? –

+0

@Fredrik Mörk: Oui! – serhio

+1

@Fredrik Les chiens et les chats n'ont * rien * en commun. Les chats sont mignons et câlins. Les chiens sont grands et barky. – bzlm

Répondre

4

.NET 4 rend ce relativement facile à l'aide covariance générique, oui - même si vous devez être explicite:

animals = dogs.Concat<Animal>(cats).ToList(); 

Autre possibilité:

animals = dogs.Cast<Animal>().Concat(cats).ToList(); 

ou:

IEnumerable<Animal> dogsAsAnimals = dogs; 
animals = dogsAsAnimals.Concat(cats).ToList(); 

Avant .NET 4, vous pouvez utiliser:

animals = dogs.Cast<Animal>().Concat(cats.Cast<Animal>()).ToList(); 

Fondamentalement, la différence avec .NET 4 est qu'il ya une conversion implicite IEnumerable<Cat>-IEnumerable<Animal>. Pour lots plus de détails, voir Eric Lippert's blog.

+0

Est-il possible d'utiliser LINQ dans cette situation? – serhio

+1

@serhio: Cela * est * en utilisant LINQ. 'Concat',' Cast' et 'ToList' sont des parties de LINQ. –

+0

cool: "); ... cependant, je vois deux' AddRange' plus "lisible" que 'dogs.Cast () .Concat (chats) .ToList();' – serhio

Questions connexes