2012-08-08 30 views
5

Do khuôn khổ hiện có tôi đang sử dụng, một cuộc gọi phương thức trả về một đối tượng SortedList. Bởi vì tôi đã viết phía bên kia của cuộc gọi này, tôi biết rằng đó là trong thực tế, một SortedList. Trong khi tôi có thể tiếp tục làm việc với SortedList, việc sử dụng generic sẽ truyền đạt ý nghĩa của tôi tốt hơn. Vì vậy, làm thế nào để bạn thay đổi SortedList không chung chung thành một SortedList chung một cách thích hợp?Làm thế nào để bạn chuyển đổi một SortedList thành một SortedList <>

Nền tảng trên đây là cuộc gọi là cuộc gọi thủ tục từ xa bằng cách sử dụng SoapFormatter. SoapFormatter không thực hiện Generics (Cảm ơn bạn, Microsoft). Tôi không thể thay đổi trình định dạng vì một số chương trình không phải của Phần mềm cũng sử dụng các cuộc gọi phương thức khác đối với dịch vụ.

Tôi muốn gọi proxy của tôi trông giống như sau:

public SortedList<string, long> GetList(string parameter) 
{ 
    return _service.GetList(parameter); 
} 

Trường hợp giao diện cho cuộc gọi GetList như sau do yêu cầu SoapFormatter:

public SortedList GetList(string parameter); 

Trả lời

4

Một chức năng chuyển đổi để sử dụng của bạn:

static SortedList<TKey,TValue> StronglyType<TKey,TValue>(SortedList list) { 
    var retval = new SortedList<TKey,TValue>(list.Count); 
    for(int i=0; i<list.Count; i++) 
     retval.Add((TKey)list.GetKey(i), (TValue)list.GetByIndex(i)); 
    return retval; 
} 

Các foreach(DictionaryEntry entry in list) cách tiếp cận tương đương là hơi chậm do các diễn viên tiềm ẩn để Unbox các DictionaryEntry (bạn luôn cần các diễn viên để TKey/TValue).

Chi phí hoạt động của Ballpark: Trên máy cũ của tôi ở đây, chức năng này mất 100ms để chuyển đổi 1000 danh sách với 1000 mục nhập mỗi.

+0

Cảm ơn bạn rất nhiều, cả về ví dụ rõ ràng và thông tin về hiệu suất. Nó rất hữu ích. – user1542042

+0

Tuy nhiên, bạn có thể nhận thấy rằng bạn đã sử dụng GetKey() hai lần trong dòng 4 của ví dụ của bạn. Tôi tin rằng trường hợp thứ hai nên là GetByIndex(). – user1542042

+0

Cảm ơn; nó đã được sửa! –

6

Bạn không thể chuyển đổi trực tiếp, dưới dạng SortedList không thực sự là SortedList<T>, ngay cả khi chỉ chứa các phần tử thuộc loại T.

Để biến điều này thành loại thích hợp, bạn cần phải tạo một SortedList<T> và thêm tất cả các phần tử vào đó.

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