2008-09-02 25 views
10

tôi có một tài sản phơi bày một nội IList <> lớp thông quaLàm cách nào để chỉ hiển thị một phần của IList <>?

System.Collections.ObjectModel.ReadOnlyCollection<> 

Làm thế nào tôi có thể vượt qua một phần của điều này ReadOnlyCollection<> mà không cần sao chép các yếu tố vào một mảng mới (Tôi cần một cái nhìn trực tiếp, và các thiết bị mục tiêu là ngắn trên bộ nhớ)? Tôi đang nhắm mục tiêu Compact Framework 2.0.

Trả lời

14

Hãy thử một phương pháp mà trả về một liệt kê sử dụng năng suất:

1

Bạn luôn có thể viết một lớp thực hiện IList và chuyển tiếp tất cả các cuộc gọi đến danh sách gốc (vì vậy nó không có bản sao dữ liệu riêng) sau khi dịch các chỉ mục.

1

Bạn có thể sử dụng yield return để tạo ra một danh sách lọc

IEnumerable<object> FilteredList() 
{ 
    foreach(object item in FullList) 
    { 
     if(IsItemInPartialList(item) 
      yield return item; 
    } 
} 
0

Làm thế nào để các yếu tố lọc cần phải được truy cập? Nếu nó thông qua một Iterator thì có lẽ bạn có thể viết một iterator tùy chỉnh bỏ qua các phần tử mà bạn không muốn hiển thị công khai?

Nếu bạn cần cung cấp Bộ sưu tập thì bạn có thể cần phải viết lớp Bộ sưu tập của riêng mình, chỉ ủy quyền cho Bộ sưu tập cơ bản, nhưng ngăn truy cập vào các yếu tố bạn không muốn hiển thị công khai.

(Disclaimer: Tôi không phải là rất quen thuộc với C#, vì vậy đây là những câu trả lời chung Có thể có câu trả lời cụ thể hơn để C# mà làm việc tốt hơn.)

1

Tùy thuộc vào cách bạn cần lọc bộ sưu tập, bạn có thể muốn tạo một lớp thực hiện IList (hoặc IEnumerable, nếu điều đó phù hợp với bạn), nhưng mucks về việc lập chỉ mục và truy cập chỉ trả về giá trị bạn muốn. Ví dụ

class EvenList: IList 
{ 
    private IList innerList; 
    public EvenList(IList innerList) 
    { 
     this.innerList = innerList; 
    } 

    public object this[int index] 
    { 
     get { return innerList[2*i]; } 
     set { innerList[2*i] = value; } 
    } 
    // and similarly for the other IList methods 
} 
8

Những mẫu foreach cũng tốt, mặc dù bạn có thể làm cho họ nhiều ngắn gọn hơn nếu bạn đang sử dụng .NET 3.5 và LINQ:

return FullList.Where(i => IsItemInPartialList(i)).ToList(); 
Các vấn đề liên quan