2013-09-30 11 views
10

Tôi có một danh sách chung đang được sử dụng bên trong một phương pháp được gọi là 4 lần. Phương thức này viết một bảng trong một tệp PDF với các giá trị của danh sách chung này.Làm cách nào để đảo ngược danh sách chung mà không thay đổi cùng một danh sách?

Vấn đề của tôi là tôi cần phải đảo ngược danh sách chung này bên trong phương pháp, nhưng tôi gọi phương thức 4 lần để danh sách được đảo ngược mỗi khi tôi gọi phương thức và tôi không muốn ... tôi có thể làm gì? Có cách nào để đảo ngược danh sách mà không đột biến bản gốc không?

Đây là bên trong phương pháp:

t.List.Reverse(); 
foreach (string t1 in t.List) 
{ 
    //Some code 
} 
+0

là danh sách được thông qua tại, nó là một lĩnh vực thể hiện của kiểu đó, là nó được tạo ra từ một cuộc gọi đến một phương pháp, hay cái gì khác? – Servy

Trả lời

23

Tùy chọn "dễ dàng" sẽ chỉ lặp danh sách theo thứ tự ngược mà không thực sự thay đổi danh sách riêng của mình thay vì cố gắng để đảo ngược nó lần đầu tiên và biết phải làm gì các thời điểm khác:

foreach (string t1 in t.List.AsEnumerable().Reverse()) 
{ 
    //Some code 
} 

Bằng việc sử dụng phương pháp LINQ Reverse thay vì List Reverse, chúng ta có thể lặp nó ngược mà không đột biến danh sách. Cần phải có AsEnumerable để ngăn phương pháp ListReverse không được sử dụng.

+0

Đó là những gì tôi đang tìm kiếm! cảm ơn bạn Linq !!! ... và Servy tất nhiên :) –

6

Bạn đang hỏi làm thế nào để tạo ra một bản sao đảo ngược của danh sách, không có đột biến bản gốc.

LINQ có thể làm điều đó:

foreach (var t1 in Enumerable.Reverse(t.List)) 
1

Bạn có thể thực hiện một trong hai điều. Hoặc đưa ra đảo ngược danh sách từ phương pháp này và ngược lại danh sách một lần trước khi gọi phương pháp này bốn lần, hoặc làm:

List<My_Type> new_list = new List<Int32>(t.List); 
new_list.Reverse(); 

Đó có một bản sao của danh sách trước khi đảo ngược nó, do đó bạn không chạm vào danh sách ban đầu .

Tôi sẽ đề xuất phương pháp đầu tiên vì hiện tại bạn đang gọi ngược 4 lần thay vì chỉ một lần.

1

Tất cả các tùy chọn đã cho đến khi nội bộ sao chép tất cả các phần tử vào danh sách khác theo thứ tự ngược lại, rõ ràng là new_list.Reverse() hoặc ẩn t.List.AsEnumerable().Reverse(). Tôi thích cái gì đó không có chi phí này như là phương pháp mở rộng dưới đây.

public class ListExtetions { 
    public static IEnumerable<T> GetReverseEnumerator(this List<T> list) { 
     for (int i = list.Count - 1; i >= 0; i--) 
       return yeild list[i]; 
    } 
} 

Và có thể được sử dụng như

foreach (var a in list.GetReverseEnumerator()) { 

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