2012-06-29 43 views
5

Tôi muốn có một hàm lấy từ điển chuỗi, mảng biến thể. Vì vậy, nó có thể được gọi với:Tôi có thể khai báo từ điển có mảng động dưới dạng loại giá trị không?

searchDictionary := TDictionary<string, array of variant>; 
    searchDictionary.Add('KEY_NAME', ['X01%', '%D01']); 
    aValue := TDtoClass.Search(searchDictionary) 

Tôi hiện đang đạt được điều này bằng cách

searchDictionary := TDictionary<string, TList<variant>>.Create; 
    searchDictionary.Add('BIN_NAME', TSearch.Values(['X01%', '%D01'])); 

nơi Tsearch là một lớp học đó cho thấy nhiều:

class function TSearch.Values(const arguments: array of variant): TList<variant>; 
var 
list : TList<variant>; 
item: variant; 
begin 
    list := TList<variant>.Create; 
    for item in arguments do 
    begin 
     list.Add(item); 
    end; 
    Result := list;   
end; 

Những gì tôi muốn làm là:

searchDictionary.Add('BIN_NAME', ['X01%', '%D01']); 

thay vì:

searchDictionary.Add('BIN_NAME', TSearch.Values(['X01%', '%D01'])); 

Mọi trợ giúp sẽ được đánh giá cao.

+0

gì chính xác là không làm việc? Nó không biên dịch (và ở vị trí nào)? – jpfollenius

+0

.Thêm (Tên: chuỗi; a: mảng const)? – Marck

+0

Thực ra đó là một mảng động chứ không phải là một mảng mở. Các mảng mở chỉ tồn tại dưới dạng tham số thủ tục. Tôi đã cập nhật tiêu đề câu hỏi. –

Trả lời

9

Trong khi không có vấn đề gì khi khai báo từ điển, việc thêm các giá trị có thể hơi phức tạp. Bạn có thể sử dụng một cấu trúc đặc biệt để có được những mảng biến theo yêu cầu:

var 
    searchDictionary: TDictionary<string, TArray<variant>>; 
begin 
    searchDictionary.Add('BIN_NAME', TArray<variant>.Create('X01%', '%D01')); 
end; 
+0

Đó là chính xác những gì tôi muốn. Một cách để thêm các phần tử mảng trong một dòng mà không cần một hàm lớp (và mục nhập khoản sử dụng bổ sung sẽ được yêu cầu). Cảm ơn! – reckface

+0

Điều quan trọng đối với kiểu generic trong khai báo có phù hợp với việc sử dụng, hoặc có thể khai báo ban đầu của Reckface bằng cách sử dụng 'mảng của Biến thể' không? –

+1

@Rob Kennedy, không có điều đó sẽ không hoạt động. Trình biên dịch phân biệt giữa 'TArray ' và 'mảng của Biến thể'. –

0

Bạn có thể khai báo một kiểu cho mảng các biến thể để làm mã giống như bạn muốn:

type 
    TDynamicArrayOfVariant = array of Variant; 

var 
    searchDictionary: TDictionary<string, TDynamicArrayOfVariant>; 
begin 
    searchDictionary.Add('BIN_NAME', ['X01%', '%D01']); 
end; 
Các vấn đề liên quan