2009-04-10 7 views
5

Môi trường là các thành viên mà tôi đang đẩy vào Bộ sưu tập là không tên, không thể nhận dạng (để tránh trừu tượng xấu, và vui lòng, đừng lo sợ: các thành viên thực sự các phiên bản Bộ sưu tập khác). Để có thể thực hiện tìm kiếm nhanh, tôi đang tạo một tên băm có ý nghĩa cho từng thành viên mới và cung cấp nó làm Chuỗi khóa, trên phương thức Thêm của Bộ sưu tập "trên cùng".Nhận khóa của một mục trên đối tượng Bộ sưu tập

Khi tôi có chìa khóa để tìm kiếm, mọi thứ dandy ... Vấn đề là tôi muốn lặp lại các thành viên của bộ sưu tập và lấy Khóa đã được cung cấp trên Thêm (Hash được tạo, không may là không có thể đảo ngược-Hash).

Tôi đang di chuyển bằng cách xác định rằng thành viên đầu tiên của thể hiện tập hợp con được chèn vào là một chuỗi, có chứa băm được đề cập, nhưng nếu có ai đó làm hỏng điều này, tôi sẽ có nhiều nghĩa vụ.

+0

Một số đoạn mã sẽ hữu ích. – boj

Trả lời

6

Cách tiếp cận đơn giản là sử dụng Dictionary thay vì Bộ sưu tập. Từ điển về cơ bản là một mảng kết hợp của các cặp khóa, mục và hỗ trợ truy xuất các khóa của nó như là một mảng. Để sử dụng từ điển, bạn sẽ cần phải thêm một tham chiếu đến Microsoft Scripting Runtime. Nhược điểm của việc sử dụng từ điển là nó không được liệt kê theo cùng cách với bộ sưu tập. Một giải pháp phức tạp hơn sẽ là bọc bộ sưu tập và từ điển để tạo một từ điển có thể đếm được như được nêu dưới đây.

NB Để NewEnum hoạt động bình thường trong VBA, mô-đun lớp phải được xuất và chỉnh sửa thủ công như sau và sau đó được nhập lại.

Public Property Get NewEnum() As IUnknown 
Attribute NewEnum.VB_UserMemId = -4 
    Set NewEnum = someKeys.[_NewEnum] 
End Property 

dụ

Option Explicit 
Private someKeys As Dictionary 
Private someCols As Collection 
Public Function Add(o As Object, Key As String) As Object 
    someKeys.Add Key, o 
    someCols.Add o, Key 
End Function 
Public Property Get Count() As Long 
    Count = someCols.Count 
End Property 
Public Property Get Item(vKey As Variant) As Object 
    Set Item = someCols.Item(vKey) 
End Property 
Public Sub Remove(vKey As Variant) 
    someKeys.Remove vKey 
    someCols.Remove vKey 
End Sub 
Public Property Get NewEnum() As IUnknown 
    Set NewEnum = someCols.[_NewEnum] 
End Property 
Public Property Get Keys() As Variant 
    Keys = someKeys.Keys 
End Property 
Private Sub Class_Initialize() 
    Set someKeys = New Dictionary 
    Set someCols = New Collection 
End Sub 
+0

Nó thu thập dữ liệu. Có Buts: i) Key không thể tùy chọn trên phương thức Add; ii) làm thế nào để bạn loại bỏ khóa tương ứng trong khi loại bỏ phương pháp ?; iii) nó là câm-có thể để aC.Keys() Xóa Tôi đề nghị: ii) someKeys.Add (Key, Key) cho phép someKeys.Remove (vKey) sau này; iii) Nhận Khóa (anIndex dài) dưới dạng Chuỗi – jpinto3912

+0

i. điểm tốt. ii. Tôi đã không đưa ra bất kỳ xem xét, và đề nghị của bạn là tốt hơn của hai lựa chọn thay thế được cung cấp, nhưng Key, Key irks tôi. Có lẽ từ điển sẽ tốt hơn cho các phím. iii. Điều đó nhận được sẽ dư thừa kể từ khi các thành viên mặc định của bộ sưu tập trở lại sẽ được .Item – cmsjr

+0

Ngoài ra, thu thập dữ liệu trong ý nghĩa của hiệu suất, hoặc theo nghĩa là không hoàn thành? – cmsjr

2

Bạn có thể bọc bộ sưu tập viên của bạn trong bạn riêng gọi bộ sưu tập mà lưu trữ các phím và bộ sưu tập. Vấn đề chỉ là lặp đi lặp lại việc ném bộ sưu tập và yêu cầu các phần tử cho khóa của chúng (tức là bạn băm).

0

cố gắng thay

Public Function NewEnum() As IUnknown 
     Set NewEnum = m_ObjectCollection.[_NewEnum] 
End Function 

với

Public Function NewEnum() As Collection 
     Set NewEnum = m_ObjectCollection 
End Function 

nó làm việc cho tôi.