2011-01-12 9 views
9

Tôi gặp sự cố với List<T>.Reverse()Reverse(this IEnumerable<TSource> source). Nhìn vào mã:Tại sao IList <>. Reverse() không hoạt động như Danh sách <>(). Đảo ngược

// Part 1 
    List<int> list = new List<int> { 1, 2, 3 }; 

    foreach (int x in list) 
    Console.Write(x); 

    Console.WriteLine(); 

    list.Reverse(); 

    foreach (int x in list) 
    Console.Write(x); 

    Console.WriteLine(); 
    list.Reverse(); 

    // Part2 
    IList<int> ilist = list; 

    foreach (int x in list) 
    Console.Write(x);  

    Console.WriteLine(); 

    ilist.Reverse(); 

    foreach (int x in ilist) 
    Console.Write(x); 

    Console.WriteLine(); 

    ilist.Reverse(); 

kết quả của tôi:

123 
321 
123 
123 

Reverse() -Part1 là List<T>.Reverse(), Reverse() -Part2 là Reverse(this IEnumerable<TSource> source) Tôi muốn thực hiện List<int>.Reverse() trong Part2 cho IList<int>. Tôi phải làm việc đó như thế nào?

+2

[Tôi đồng ý với bạn rằng đây là khó hiểu.] (Http://stackoverflow.com/questions/2828917/most- lúng túng, phương pháp-in-the-net-api/2829051 # 2829051) –

Trả lời

8

IList<int> không có phương thức Reverse, do đó, nó sử dụng phương pháp mở rộng. Cách duy nhất để sử dụng List<T>.Reverse trên tài liệu tham chiếu IList<int> của bạn là truyền hoặc chuyển đổi nó thành List<int>. Đúc sẽ chỉ làm việc nếu bạn chắc chắn rằng nó thực sự là một List<int> ở nơi đầu tiên:

IList<int> abstractList; 
var concreteList = (List<int>)abstractList; 
concreteList.Reverse(); 

Một lựa chọn khác sẽ được tạo một List<int> từ IList<int> dụ của bạn, chứ không phải là giả sử nó đã là một List<int>:

IList<int> abstractList; 
var concreteList = new List<int>(abstractList); 
concreteList.Reverse(); 

các lý do rằng phương pháp Reverse mở rộng không thực sự ảnh hưởng đến danh sách cơ bản là bởi vì nó hoạt động trên IEnumerable<T>, w hich không nhất thiết phải ghi (không có phương thức mở rộng nào của Enumerable thực hiện thay đổi đối với bộ sưu tập gốc, chúng sẽ trả về bộ sưu tập mới mới).

Để sử dụng phiên bản này của Reverse, chỉ cần sử dụng các sản phẩm của Reverse cuộc gọi, chứ không phải là danh sách ban đầu:

IList<int> abstractList; 
IEnumerable<int> reversedList = abstractList.Reverse(); 
4

Trong ví dụ thứ hai, bạn đang sử dụng một phương pháp mở rộng chống lại IEnumerable<T>, và điều này không thay đổi bộ sưu tập gốc mà là tạo một truy vấn sẽ dẫn đến một chuỗi danh sách gốc của bạn theo thứ tự ngược lại. Đó là để nói, nếu bạn muốn sử dụng các kết quả của ilist.Reverse(), bạn sẽ nói

var reversedList = iList.Reverse(); 
// reversedList is IEnumerable<int> 
// 'list' and 'ilist' are not changed 

foreach (int item in reversedList) 
    Console.Write(item); 
+0

câu trả lời ngắn gọn nhưng ngắn gọn cho vấn đề ở bàn tay. Giúp tôi. Cảm ơn +1 –