2009-10-23 12 views

Trả lời

15

Bạn có thể sử dụng LINQ:

var lastItem = sortedDict.Values.Last(); 

Bạn cũng có thể lấy chìa khóa cuối cùng:

var lastkey = sortedDict.Keys.Last(); 

Bạn thậm chí có thể nhận được cuối cùng cặp khóa-giá trị:

var lastKeyValuePair = sortedDict.Last(); 

này sẽ cung cấp cho bạn một KeyValuePair<TKey, TValue> với KeyValue tài sản.

Lưu ý rằng điều này sẽ ném một ngoại lệ nếu từ điển trống; nếu bạn không muốn điều đó, hãy gọi LastOrDefault.

+5

Những phương pháp này có khả năng kích hoạt liệt kê. Tôi tự hỏi nếu có bất kỳ cách nào để có được các yếu tố cuối cùng (hoặc yếu tố từ bất kỳ chỉ số vị trí) mà không có liệt kê? Kể từ khi SortedDictionary được sắp xếp thành một cây, nó có thể là trong lý thuyết có thể? –

+1

@ RolandPihlakas: Về lý thuyết, có. Trong thực tế, tôi không nghĩ vậy. – SLaks

+9

Đối với người nào đó từ nền C++, điều này khó chấp nhận. Đếm thông qua toàn bộ từ điển được sắp xếp chỉ để có được yếu tố cuối cùng là vô vọng không hiệu quả. Có nhiều thư viện C# Collection có khả năng hơn không? –

1

Bạn có thể sử dụng SortedDictionary.Values.Last();

hoặc nếu bạn muốn khóa và giá trị

SortedDictionary.Last(); 
10

Last phương pháp mở rộng sẽ cho bạn kết quả, nhưng nó sẽ phải liệt kê toàn bộ bộ sưu tập để đưa bạn đến đó. Thật là một sự xấu hổ SortedDictionary<K, V> không phơi bày các thành viên MinMax đặc biệt là xem xét nội bộ được hỗ trợ bởi một SortedSet<KeyValuePair<K, V>> có các thuộc tính MinMax.

Nếu O (n) không phải là mong muốn, bạn có một vài lựa chọn:

  1. Đổi thành một SortedList<K, V>. Một lần nữa vì lý do nào đó, BCL không đóng gói theo mặc định. Bạn có thể sử dụng các chỉ mục để có được giá trị cực đại (hoặc tối thiểu) trong thời gian O (1). Mở rộng với các phương pháp mở rộng sẽ được tốt đẹp.

    //Ensure you dont call Min Linq extension method. 
    public KeyValuePair<K, V> Min<K, V>(this SortedList<K, V> dict) 
    { 
        return new KeyValuePair<K, V>(dict.Keys[0], dict.Values[0]); //is O(1) 
    } 
    
    //Ensure you dont call Max Linq extension method. 
    public KeyValuePair<K, V> Max<K, V>(this SortedList<K, V> dict) 
    { 
        var index = dict.Count - 1; //O(1) again 
        return new KeyValuePair<K, V>(dict.Keys[index], dict.Values[index]); 
    } 
    

    SortedList<K, V> kèm theo các hình phạt khác. Vì vậy, bạn có thể muốn xem: What's the difference between SortedList and SortedDictionary?

  2. Viết của riêng bạn SortedDictionary<K, V> lớp. Điều này rất tầm thường. Có một SortedSet<KeyValuePair<K, V>> làm vùng chứa nội bộ và so sánh trên phần Key. Một cái gì đó như:

    public class SortedDictionary<K, V> : IDictionary<K, V> 
    { 
        SortedSet<KeyValuePair<K, V>> set; //initialize with appropriate comparer 
    
        public KeyValuePair<K, V> Min { get { return set.Min; } } //O(log n) 
        public KeyValuePair<K, V> Max { get { return set.Max; } } //O(log n) 
    } 
    

    Đây là O (log n). Không có tài liệu, nhưng tôi đã kiểm tra mã.

  3. Sử dụng phản chiếu khó dùng để truy cập bộ sao lưu là thành viên riêng tư của lớp SortedDictionary<K, V> và gọi các thuộc tính MinMax. Người ta có thể dựa vào các biểu thức để biên dịch một đại biểu và lưu trữ nó để thực hiện. Đó là một sự lựa chọn rất nghèo để làm như vậy. Không thể tin rằng tôi đã đề xuất điều này.

  4. Dựa trên các triển khai khác, ví dụ: Đối với TreeDictionary<K, V> from C5.Họ có FindMinFindMaxboth of which are O(log n)

+0

Có thể muốn sắp xếp lại các tùy chọn này để các tùy chọn tốt hơn ở trên cùng, thay vì đưa chúng vào, những gì tôi đoán, là thứ tự mà bạn nghĩ về chúng. – Servy

+0

Bạn sẽ triển khai chỉ mục/'TryGetValue' cho tùy chọn thứ hai của mình như thế nào? – CodesInChaos

+0

@CodesInChaos bạn nói đúng, điều đó khiến nó vô dụng. Đó là bộ buồn trong. NET không phơi bày một cách để có được các tài liệu tham khảo thực tế. Tôi nên chỉnh sửa câu trả lời. – nawfal

-1

danh sách SortedList ...

list[ Keys[Keys.Count - 1] ]; // returns the last entry in list