2013-08-06 38 views
7

Tôi cần từ điển danh sách vòng có thể lưu trữ khóa và mục. Capacity = 50 và khi tôi thêm #51 mục đầu tiên phải được xóa. Về cơ bản nó phải là một từ điển hoạt động giống như một danh sách vòng.C# - Từ điển có hành vi của Danh sách Vòng?

Có điều gì đó trong .NET Framework có thể làm điều đó không? Hay tôi phải tự viết nó?

+2

Bạn sẽ phải để tự mình viết. Chỉ cần sử dụng danh sách được liên kết và từ điển bên dưới. –

+1

Giống như Haris Hasan đã nói, bạn có thể sử dụng OrderedDictionary. Nó không phải là lớp niêm phong, vì vậy bạn có thể kế thừa từ nó và viết định nghĩa phương thức 'Insert' mới (http://msdn.microsoft.com/en-us/library/435f1dw2.aspx). Thật không may, nó không quan trọng nhưng bạn có thể sử dụng lớp học của bạn explicity. –

Trả lời

1

Hãy thử điều này:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var rD = new RingDictionary(50); 
     for (int i = 0; i < 75; i++) 
     { 
      rD.Add(i, i); 
     } 
     foreach (var item in rD.Keys) 
     { 
      Console.WriteLine("{0} {1}", item, rD[item]); 
     } 
    } 
} 

class RingDictionary : OrderedDictionary 
{ 
    int indexKey; 

    int _capacity = 0; 
    public int Capacity 
    { 
     get { return _capacity; } 
     set 
     { 
      if (value <= 0) 
      { 
       var errorMessage = typeof(Environment) 
        .GetMethod(
         "GetResourceString", 
         System.Reflection.BindingFlags.Static | 
         System.Reflection.BindingFlags.NonPublic, 
         null, 
         new Type[] { typeof(string) }, 
         null) 
        .Invoke(null, new object[] { 
         "ArgumentOutOfRange_NegativeCapacity" 
        }).ToString(); 
       throw new ArgumentException(errorMessage); 
      } 
      _capacity = value; 
     } 
    } 

    public RingDictionary(int capacity) 
    { 
     indexKey = -1; 
     Capacity = capacity; 
    } 

    public new void Add(object key, object value) 
    { 
     indexKey++; 

     if (base.Keys.Count > _capacity) 
     { 
      for (int i = base.Keys.Count-1; i >Capacity-1 ; i--) 
      { 
       base.RemoveAt(i); 
      } 
     } 

     if (base.Keys.Count == _capacity) 
     { 
      base.RemoveAt(indexKey % _capacity); 
      base.Insert(indexKey % _capacity, key, value); 
     } 
     else 
     { 
      base.Add(key, value); 
     } 
    } 
} 
+0

Để có hiệu suất tốt hơn, bạn không nên loại bỏ và chèn các giá trị nhưng ghi đè lên các giá trị cũ. Bên cạnh đó tôi sẽ đi theo cách của bạn. – Bitterblue

5

Bạn sẽ không tìm thấy bất cứ điều gì built-in Tôi nghĩ nhưng bạn có thể dễ dàng thực hiện một cách sử dụng OrderedDictionary

OrderedDictionary duy trì mục theo thứ tự mà chúng được chèn vào. Bất cứ khi nào bạn đạt đến giới hạn/dung lượng, bạn có thể xóa mục đầu tiên.

2

hoặc sử dụng một phương pháp khuyến nông:

EDIT:

mới nhất tiêu đề bổ sung kết thúc lên được trả lại đầu tiên.

nên u có thể loại bỏ các mục đầu tiên như:

dictionary.Remove(dictionary.Last().Key); 

& vì vậy phương pháp mở rộng của bạn là:

addExtension(this Dictionary<string, object> dictionary, string key, object value) 
    { 
     if(dictionary.Count == 50) 
       dictionary.Remove(dictionary.Last().Key); 

     dictionary.Add(key, value); 
    } 
+0

Phiên bản được thông số: 'static void AddExtension (IDictionary từ điển, khóa T, giá trị V) { dictionary.Add (khóa, giá trị); if (dictionary.Count == 50) dictionary.Remove (dictionary.First() Key.); } ' –

+0

Bạn không xóa một mục ngẫu nhiên khỏi' Từ điển'? Thứ tự của các mục trong một 'Từ điển' không được xác định. Có lẽ bạn thậm chí có thể được xóa mục bạn vừa thêm :-) Xem ví dụ http://stackoverflow.com/a/4007787/613130 ​​ – xanatos

+0

@xanatos thấy chỉnh sửa –

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