2010-12-14 22 views
5

Tôi có một ArrayList loại BookingData đến List<BookingData>?Cách tốt nhất để truyền từ ArrayList vào Danh sách trong .Net 2.0

Tôi đang sử dụng .net 2.0 vì vậy tôi không thể sử dụng arrayList.Cast<int>().ToList() và tôi không muốn tạo vòng lặp foreach ở đây, bạn có ý tưởng hay hơn không?

Cảm ơn.

+0

Trong C# bạn thực sự cần phải đưa 'ArrayList' vào' List'? – khachik

+0

@khachik: 'ArrayList' thuộc loại' Object' và 'List' là kiểu generic. – Bobby

+0

@khachik, chúng đều là các lớp cụ thể trong C#. –

Trả lời

11

Do lưu ý rằng một cái gì đó sẽ phải liệt kê các mảng danh sách để xây dựng các List<T>; nó chỉ là vấn đề của việc bạn tự mình làm hay để nó cho một phương pháp khác (khung công tác/tiện ích).

  1. Nếu đây là một một lần, các giải pháp mà bạn muốn tránh (sử dụng một "tại chỗ" foreach vòng lặp để thực hiện chuyển đổi) là một lựa chọn hoàn toàn hợp lý. Nếu bạn thấy mình làm điều này khá thường xuyên, bạn có thể giải nén nó ra thành một phương pháp tiện ích chung chung, như trong câu trả lời của cdhowie.

  2. Nếu hạn chế của bạn duy nhất là bạn phải mục tiêu .NET 2.0 (nhưng có thể sử dụng C# 3), hãy xem xét LINQBridge, mà là một reimplementation của LINQ to Objects cho .NET 2.0. Điều này sẽ cho phép bạn sử dụng mẫu Cast bạn đã cung cấp mà không thay đổi. Nó cũng sẽ hoạt động trên C# 2, nhưng bạn sẽ không nhận được lợi ích của cú pháp phương pháp mở rộng, tốt hơn kiểu suy luận, vv.

  3. Nếu bạn không quan tâm đến hiệu suất, bạn cũng không muốn những rắc rối của việc viết một phương pháp hữu ích, bạn có thể sử dụng trong xây dựng ArrayList.ToArray phương pháp để giúp đỡ, bằng cách tạo ra một mảng trung gian mà chơi tốt với List<T> (đây không phải là tất cả những gì ngắn hơn một 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); 

Cuối cùng, tôi sẽ đề nghị, nếu có thể từ bỏ việc sử dụng các bộ sưu tập hoàn toàn không chung chung.

+2

Chỉ cần FYI, phương pháp này sẽ tạo ra một mảng trung gian không cần thiết. – cdhowie

1

Sử dụng phương pháp này:

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

Sau đó, bạn có thể:

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

Trình biên dịch .NET 2.0 không hỗ trợ các phương thức mở rộng và var. – TToni

+0

@TToni: Đủ rồi. Đó chỉ là một sự khác biệt cú pháp. Tôi sẽ sửa chữa nó. – cdhowie

+0

Logic mã cũng giống nhau. –

0

Bạn phải sử dụng foreach:

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

Bạn * có * để sử dụng foreach? Không có gì khác sẽ làm việc? – cdhowie

+0

Bất kỳ 'cấu trúc vòng lặp' nào khác sẽ ... Nhưng bạn phải lặp lại nó. – decyclone

2

Hãy giữ nó đơn giản:

// 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

Bạn cần truyền 'mục' sang' T'. – cdhowie

+3

@cdhowie: Nếu bộ nhớ phục vụ foreach sẽ làm điều đó. Old Fx2 voodoo. –

+0

Ồ, đúng vậy. Tôi luôn quên về những cái vỏ ngụ ý như thế. – cdhowie

0

ToList() phương pháp là gì, nhưng các đường tổng hợp để tạo một danh sách đại diện nhưng trong nội bộ nó cũng được sử dụng lặp lại để tạo mục danh sách.

do đó, việc sử dụng khối lặp lặp lại dễ dàng hơn và đơn giản hơn nhiều.

Các vấn đề liên quan