2010-01-05 5 views
3

Disons que j'ai List<Cookie> et je veux le convertir en CookieCollection. Quelle est la meilleure façon de faire cela?Convertir la liste <Cookie> à CookieCollection en C#

Je sais que je peux utiliser une boucle foreach, mais n'y a-t-il pas moyen de l'instancier avec un code similaire?

List<Cookie> l = ...; 
var c = new CookieCollection() { l }; 

Lorsque je tente de compiler que si, je reçois l'erreur:

The best overloaded Add method 'System.Net.CookieCollection.Add(System.Net.CookieCollection)' for the collection initializer has some invalid arguments

BTW, il y a deux Add méthodes CookieCollection supports:

public void Add(Cookie cookie); 
public void Add(CookieCollection cookies); 
+0

Est-ce que CookieCollection a un constructeur qui prend un IEnumerable ou ICollection ? – Sapph

+0

Non, le seul constructeur ne prend aucun paramètre. – Senseful

+0

Vous pourriez envisager de regarder (potentiellement) [question en double] (http://stackoverflow.com/questions/524428/cannot-implicitly-convert-listt-to-collectiont). –

Répondre

4

CookieCollection a été écrit avant .Net 2 (avant Generics). Par conséquent, il n'y a vraiment pas de moyen rapide de le faire autrement que manuellement avec une boucle foreach.

+0

Merci pour l'explication de pourquoi il n'y a pas de moyen rapide de le faire. – Senseful

+0

Vous n'avez pas besoin d'utiliser manuellement une boucle C# foreach si vous utilisez la méthode List .ForEach (..) Paul Creasey posté dans sa réponse. –

+0

@jdk: C'est toujours une boucle foreach avec une syntaxe différente. – BFree

1

Vous pouvez passer un lambda à la méthode ForEach d'une liste. Cela fonctionnera indépendamment des constructeurs de la CookieCollection.

List<Cookie> l = ...; 
var c = new CookieCollection(); 
l.ForEach(tempCookie => c.Add(tempCookie)); 
0
List<Cookie> l = ...; 
var c = new CookieCollection(); 
l.ForEach(x => c.Add(x)); 
+0

C# 3.x et en utilisant System.Collections.Generic; –

8

Compte tenu c et l comme dans votre premier exemple, ça va faire:

l.ForEach(c.Add); 
+0

ne se rendait pas compte que vous pourriez passer le lambda, sympa. –

+0

bien oui 'x => y (x)' est juste un raccourci pour "une fonction qui prend x, et y y avec", et puisque 'c.Add' répond aussi à cette description, vous pouvez passer cette fonction tout comme votre lambda plutôt-anonyme-typé =) est soigné –

+0

Raccourci intéressant. Dommage que vous ne puissiez pas marquer deux réponses comme acceptées. Dans ce cas, cependant, j'étais un peu plus intéressé de savoir pourquoi je ne pouvais pas l'initialiser avec ce formulaire, alors j'ai accepté l'autre réponse. – Senseful

Questions connexes