2010-12-14 3 views
5

J'ai un ArrayList de type BookingData à List<BookingData>? J'utilise .net 2.0 donc je ne peux pas utiliser arrayList.Cast<int>().ToList(), et je ne veux pas faire ici boucle foreach, avez-vous de meilleures idées?Quel est le meilleur moyen de transtyper depuis ArrayList vers List dans .Net 2.0

Merci.

+0

En C# vous avez vraiment besoin de lancer 'ArrayList' en' List'? – khachik

+0

@khachik: 'ArrayList' est de type' Object' et 'List' est un type générique. – Bobby

+0

@khachik, ce sont deux classes concrètes en C#. –

Répondre

11

Notez que la quelque chose va devoir énumérer la liste de tableau pour construire le List<T>; C'est seulement une question de savoir si vous le faites vous-même ou si vous le laissez à une autre méthode (cadre/utilitaire).

  1. Si c'est un unique, la solution que vous souhaitez éviter (en utilisant un « in situ » boucle foreach pour faire la conversion) est une option tout à fait raisonnable. Si vous vous trouvez assez souvent, vous pouvez extraire cela dans une méthode d'utilité générique, comme dans la réponse de cdhowie.

  2. Si votre restriction est seulement que vous devez cible .NET 2.0 (mais peut utiliser C# 3), pensez à LINQBridge, qui est une ré-implémentation de LINQ to Objects pour .NET 2.0. Cela vous permettra d'utiliser l'échantillon Cast que vous avez fourni sans modification. Cela fonctionnera aussi sur C# 2, mais vous n'aurez pas les avantages de la syntaxe extension-méthode, meilleure inférence de type, etc.

  3. Si vous ne vous souciez pas de la performance et que vous ne voulez pas aller à la peine d'écrire une méthode utilitaire, vous pouvez utiliser la méthode pour aider ArrayList.ToArray en construction sur, en créant un tableau intermédiaire qui joue bien avec List<T> (ce n'est pas tout ce plus court qu'un foreach):


ArrayList arrayList = ... 

// Create intermediary array 
BookingData[] array = (BookingData[]) arrayList.ToArray(typeof(BookingData)); 

// Create the List<T> using the constructor that takes an IEnumerable<T> 
List<BookingData> list = new List<BookingData>(array); 

Enfin, je suggère, si possible d'abandonner l'utilisation des classes de collection non génériques obsolètes tout à fait.

+2

Juste pour info, cette méthode va créer un tableau intermédiaire inutile. – cdhowie

1

Utilisez cette méthode:

public static List<T> ConvertToList<T>(ArrayList list) 
{ 
    if (list == null) 
     throw new ArgumentNullException("list"); 

    List<T> newList = new List<T>(list.Count); 

    foreach (object obj in list) 
     newList.Add((T)obj); 

    // If you really don't want to use foreach: 
    // for (int i = 0; i < list.Count; i++) 
    //  newList.Add((T)list[i]); 

    return newList; 
} 

Vous pouvez alors:

List<BookingData> someList = ConvertToList<BookingData>(someArrayList); 
+0

Le compilateur .NET 2.0 ne supporte pas les méthodes d'extension et var. – TToni

+0

@TToni: assez vrai. Ce n'est qu'une différence syntaxique. Je le réparerai. – cdhowie

+0

La logique du code est la même, néanmoins. –

0

Vous devez utiliser foreach:

 foreach (Object item in list1) 
     { 
      list2.Add((BookingData)item); 
     } 
+0

Vous devez * utiliser * foreach? Rien d'autre ne fonctionnera? – cdhowie

+0

N'importe quelle autre construction de boucle va ... Mais vous devez le parcourir. – decyclone

2

Gardons simple: méthode

// untested 
List<T> ConvertArrayList<T>(ArrayList data) 
{ 
    List<T> result = new List<T> (data.Count); 
    foreach (T item in data) 
     result.Add(item); 
    return result; 
} 

... 

List<BookingData> newList = ConvertArrayList<BookingData>(oldList); 
+0

Vous devez lancer 'item' à' T'. – cdhowie

+3

@cdhowie: Si la mémoire sert le foreach le fera. Vieux Voodoo Fx2. –

+0

Oh, c'est vrai. J'oublie toujours les moulages implicites comme ça. – cdhowie

0

ToList() n'est que le sucre synthétique pour créer une représentation de la liste, mais en interne, il utilise aussi boucle pour générer l'élément de liste.

il est donc beaucoup plus propre et plus simple d'utiliser un bloc d'itération pour chaque.

Questions connexes