2010-01-26 60 views
6

Tôi đã tìm kiếm việc thực hiện tiêu chuẩn của một danh sách được liên kết kép trong C# (để tôi có một danh sách liên kết tôi có thể lặp qua lại) và không thể tìm thấy nó. Tôi cảm thấy như một cái gì đó rất đơn giản phải có một thực hiện mà tôi chỉ thiếu.C# /. Net x.x có thực hiện danh sách được liên kết kép (có thể được lặp lại qua lại) không?

Nếu nó tồn tại, phiên bản nào của C# /. Net tồn tại?

Lặp lại đảo ngược nói chung có vẻ là một cái gì đó không có ý định được thực hiện trong C#. Là tâm trí của tôi chỉ bị mắc kẹt quá nhiều trong c + +/stl chế độ hoặc là điều này một cái gì đó thiếu trong C#?

Tôi biết về LinkedList nhưng không tìm được cách lặp lại nó đã giả định nó được liên kết đơn lẻ.

Nếu LinkedList được liên kết gấp đôi như thế nào đi lặp lại qua nó ngược (Hiệu quả)?

Trả lời

6

Cũng như các câu trả lời đưa ra ở đây, bạn có thể viết một phương pháp khuyến nông để LinkedList<T> để làm điều này một chút dễ dàng hơn để tái sử dụng:

public static IEnumerable<T> Backwards(this LinkedList<T> list) 
{ 
    LinkedListNode<T> node= list.Last; 
    while (node != null) 
    { 
     yield return node.Value; 
     node = node.Previous; 
    } 
} 

Sử dụng với:

foreach (string x in list.Backwards()) 
{ 
    // ... 
} 
+2

Ít lỗi chính tả: 'LinkedListNode ' phải là 'LinkedListNode ' – Oliver

+0

@Oliver: cảm ơn, đã sửa. –

+0

Cảm ơn. Tôi là một chút bối rối tại sao một cái gì đó như thế này không phải là chỉ trong lib tiêu chuẩn rồi. – Catskul

2

Làm thế nào về System.Collections.Generic.LinkedList()

Dưới đây là các tài liệu trên MSDN:

http://msdn.microsoft.com/en-us/library/he2s3bh7.aspx

Version Info
.NET Framework: Được hỗ trợ trong: 3.5, 3.0, 2.0
Khung nhỏ gọn .NET: Được hỗ trợ trong: 3.5, 2.0
Khung XNA: Được hỗ trợ trong: 3.0, 2.0, 1.0

Điều đó nói rằng, tôi với những người khác rằng nó thường là thích hợp hơn để sử dụng một trừu tượng cao hơn khi làm việc với một khuôn khổ phong phú như vậy.

+0

Tôi có một nhu cầu cụ thể đối với có thể lặp lại trong danh sách ngược, và có chèn giá rẻ + sắp xếp lại giá rẻ. – Catskul

+0

Được rồi, phần đầu tiên của câu trả lời của tôi sẽ giúp bạn. – JohnFx

+0

RTFM không phải là hữu ích đặc biệt là kể từ khi các tài liệu không cụ thể đối phó với lặp lại đảo ngược. Nếu chúng ta chỉ định nói với mọi người về RTFM thì tại sao lại có Stackoverflow? – Catskul

1

Làm thế nào về LinkedList?

+0

Làm thế nào để bạn có hiệu quả lặp qua nó ngược? – Catskul

+0

while (nodeP! = Null) nodeP = nodeP.Previous; – kenny

10

Các mã sau sẽ có hiệu quả lặp trên một LinkedList ngược lại:

 LinkedList<string> list = new LinkedList<string> 
      (new[] {"cat", "dog", "frog", "antelope", "gazelle"}); 
     LinkedListNode<string> item = list.Last; 
     do 
     { 
      Console.WriteLine(item.Value); 
      item = item.Previous; 
     } 
     while (item != null); 
     Console.ReadKey(); 

Mấu chốt ở đây là một LinkedList chứa tham chiếu đến chỉ đầu tiên và cuối LinkedListNode trường hợp của danh sách. Mỗi cá thể LinkedListNode giữ một tham chiếu đến mục tiếp theo và trước đó trong danh sách (hoặc null ở mỗi đầu của danh sách) và cũng là một thuộc tính Value. Điều này có nghĩa là lặp lại từ LinkedListNode đầu tiên hoặc cuối cùng là dễ dàng, nhưng truy cập ngẫu nhiên yêu cầu lặp lại từ đầu tiên hoặc cuối cùng trong danh sách.

Nếu bạn cần thực hiện chèn trên đường đi, hãy sử dụng LinkedList.AddBefore hoặc AddAfter để chèn một LinkedListNode mới.

+0

Đó là những gì tôi đã tìm kiếm. Vì một lý do nào đó, tôi đã có ấn tượng rằng Danh sách .Last sẽ trả về một thứ gì đó thuộc loại T. Cảm ơn bạn. Bằng cách nào đó bạn là người duy nhất dường như đã hiểu được vấn đề hoặc thậm chí cả các khái niệm đằng sau các danh sách liên kết ở tất cả:/ – Catskul

+0

Một container được đánh giá thấp. Vui mừng được giúp đỡ. – spender

+1

Điều này sẽ ném một ArgumentNullException nếu danh sách rỗng. Thay đổi vòng lặp do/while thành một vòng lặp (đơn giản hơn để đọc, IMO) trong khi vòng lặp sẽ giải quyết được vấn đề - xem câu trả lời của tôi cho một ví dụ. –

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