2010-12-14 6 views
5

ArrayListBookingData türünde List<BookingData> var mı?ArrayList'ten List'e listelenmesinin en iyi yolu nedir? Net 2.0

.net 2.0 kullanıyorum bu yüzden arrayList.Cast<int>().ToList() kullanamıyorum ve burada foreach döngüsünü yapmak istemiyorum, daha iyi fikirleriniz var mı?

Teşekkürler.

+0

C# dizisinde gerçekten "ArrayList" i "List" e çevirmeniz gerekiyor mu? – khachik

+0

@khachik: 'ArrayList'' Nesne' türündedir ve 'Liste' genel bir türdür. – Bobby

+0

@khachik, ikisi de C# 'daki somut sınıflar. –

cevap

11

şey inşa etmek dizisi-listesini sıralamak zorunda olacak unutmayın etmeyin List<T>; onun sadece kendiniz yapıp yapmadığınızı veya başka bir (framework/utility) metoduna bırakıp bırakmadığınızı. Bu bir kerelik ise

  1. , siz (dönüşüm yapmak için bir "yerinde" foreach döngü kullanarak) önlemek isteyen çözüm mükemmel makul bir seçenektir. Eğer bunu oldukça sık yapıyorsanız, bunu cdhowie'nin cevabında olduğu gibi jenerik bir yardımcı programa çıkarabilirsiniz.

  2. sizin kısıtlama yalnızca ise bunu bu hedef .NET 2.0 (ancak 3 C# kullanabilirsiniz), .NET 2.0 için LINQ nesnelere bir reimplementation olan LINQBridge, düşünün. Bu, değiştirmeden sağladığınız Cast örneğini kullanmanıza izin verecektir. Çok C# 2 üzerinde çalışacak, ancak, daha iyi tip-çıkarım uzantısı-yöntem sözdizimi faydalarını almazsınız vb

  3. Performansta önemsemez, ne de gitmek istiyorum yapmazsanız

: bir yardımcı yöntem yazma bela, (bu bütün bir foreach daha o kısa değildir) List<T> ile iyi oynar bir ara dizi oluşturarak, yardım için inşa in- ArrayList.ToArray yöntemi kullanabilirsiniz
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); 

Son olarak, eğer mümkünse eski olmayan jenerik koleksiyon sınıflarını kullanmayı bırakmayı öneririm.() Yöntemi, bir Liste temsilini oluşturmak için sentetik şekerin başka bir şey değildir ama içten o da kullanıyor

// 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); 
+2

Sadece FYI, bu yöntem gereksiz bir ara dizi oluşturacaktır. – cdhowie

1

bu yöntemi kullanın: Sonra

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; 
} 

şunları yapabilirsiniz:

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

.NET 2.0 derleyici, uzantı yöntemlerini ve var. – TToni

+0

@TToni: Yeterince doğru. Bu sadece sözdizimsel bir fark. Onu tamir edeceğim. – cdhowie

+0

Kod mantığı yine de aynıdır. –

0

Sen foreach kullanmak zorunda liste öğesini oluşturmak için döngü.

Bu nedenle, bir foreach yineleme bloğu kullanmak çok daha temiz ve daha basittir.

+0

Siz * foreach kullanmak için * var? Başka hiçbir şey işe yaramayacak mı? – cdhowie

+0

Herhangi bir "diğer döngü yapısı" ... Ama bunun üzerinden geçmeniz gerekiyor. – decyclone

2

en basit tutmak edelim:

+0

'item' öğesini' T' olarak atamanız gerekir. – cdhowie

+3

@cdhowie: Hafıza foreach hizmet ediyorsa, bunu yapar. Eski Fx2 vudu. –

+0

Oh, doğru. Her zaman bunun gibi ima edilen oyuncuları unuturum. – cdhowie

0

ToList:

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