2010-03-03 22 views
8

Khuôn khổ .NET chứa từ phiên bản 3.0 ObservableCollection<T>, nhưng tại sao lại không có một ObservableKeyedCollection < TKey, TValue >.Tại sao không có ObservableKeyedCollection <TKey, TValue> trong .NET Framework?

Được rồi tôi có thể triển khai bộ sưu tập của riêng mình bằng cách lấy từ KeyedCollection<TKey,TValue> và triển khai giao diện INotifyCollectionChanged, nhưng không thể là một bổ sung tốt cho Khuôn khổ .NET.

Trả lời

2

Lý do mà không có ObservableKeyedCollection (hoặc bất kỳ loại khác như vậy mà chỉ đơn thuần là một sự kết hợp của các loại generic khác) là vì ObservableCollection là chung chung, và làm cho việc thực hiện một "ObservableKeyedCollection" dễ dàng như này:

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Collections.Specialized; 

public class DictionaryWatcher : ObservableCollection<KeyValuePair<string, object>>, IDisposable 
{ 
    private NotifyCollectionChangedEventHandler watcher; 
    private bool watching = false; 

    public DictionaryWatcher() 
    { 
     watcher = new NotifyCollectionChangedEventHandler(ReportChange); 
     CollectionChanged += watcher; 
     Watched = true; 
    } 

    public bool Watched 
    { 
     get 
     { 
      return watching; 
     } 

     set 
     { 
      if (watching) 
      { 
       lock (this) 
       { 
        CollectionChanged -= watcher; 
        watching = false; 
       } 
      } 
     } 
    } 

public void Dispose() 
{ 
    Dispose(true); 
    GC.SuppressFinalize(this); 
} 

    public void Initialize() 
    { 
     this.Add(new KeyValuePair<string, object>("First", 1)); 
     this.Add(new KeyValuePair<string, object>("Second", 2)); 
     this.Add(new KeyValuePair<string, object>("Turd", 3)); 
     KeyValuePair<string, object> badValue = this[2]; 
     this.Remove(badValue); 
    } 

protected virtual void Dispose(bool disposing) 
{ 
    if (disposing && Watched) 
    { 
     Watched = false; 
    } 
} 

    private void ReportChange(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     Console.WriteLine("Change made: {0}", e.Action); 
    } 
} 

Trong khi đó chắc chắn không phải là một chương trình một lớp, phần lớn trong số đó là bản mẫu. Quan trọng nhất, nó không tái thực hiện các ObservableCollection như bạn đã đề xuất; thay vào đó nó hoàn toàn sử dụng nó.

Lý do khiến nó "không thể là một bổ sung tốt cho .NET Framework" là bởi vì khi đã có một cách để làm điều gì đó, việc tạo ra một cách khác để làm điều đó là một ý tưởng tồi. Có ít cách để thực hiện một số công việc cụ thể, ít cách hơn để làm điều đó một cách kém. 8)

Các công cụ được cung cấp, bây giờ tất cả về cách bạn sử dụng chúng.

Hy vọng điều đó sẽ hữu ích!

+9

Có rất nhiều thứ có sẵn trong KeyedCollection không có trong giải pháp của bạn. Ví dụ một người lập chỉ mục dựa trên khóa, ngăn không cho thêm các mục có cùng khóa, vv Vì vậy, mã trên có thể là bản mẫu, nhưng chắc chắn là không hoàn chỉnh. Khuôn khổ là để cung cấp cho chúng tôi các công cụ không chỉ hữu ích để sử dụng, mà còn hoàn thành trong việc thực hiện của họ ... –

+3

Tôi đồng ý với Jeroen. Câu trả lời này không có các khả năng cơ bản của KeyedCollection. Tôi cũng muốn chỉ ra rằng nếu ObservableKeyedCollection được cung cấp bởi khung công tác, thì chúng ta sẽ có những cách ít nhất có thể để làm điều này - 1 - thay vì tất cả mọi người tạo ra giải pháp của riêng họ, nhiều giải pháp sẽ bị hỏng như thế này. – totorocat

1

Tôi khuyên bạn nên xem C5. Đây là thư viện sưu tập chung tuyệt vời cung cấp các bộ sưu tập quan sát làm chuẩn cho tất cả các bộ sưu tập của nó, bao gồm Added, Inserted, Removed, RemovedAt, ClearedChanged. Ngoài ra, các bộ sưu tập C5 đều tán thành "lập trình giao diện" lý tưởng. Tất cả các giao diện cung cấp đầy đủ chức năng của các triển khai cơ bản — thiếu trong không gian tên System.Collections.Generic. Ngoài ra, có kỹ lưỡng documentation. Tôi rất khuyến khích bạn kiểm tra nó.

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