2012-06-29 18 views
5

Me gustaría tener una función que tome un diccionario de cadena, matriz de variante. Por lo que se puede llamar con:¿Puedo declarar un diccionario con matriz dinámica como tipo de valor?

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

Actualmente estoy logrando esto

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

donde Tsearch es una clase que expone:

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; 

Lo que me gustaría hacer es:

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

en lugar de:

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

Cualquier ayuda será muy apreciada.

+0

¿Qué es exactamente no está funcionando? ¿No compila (y en qué posición)? – jpfollenius

+0

.Add (Nombre: cadena; a: matriz de const)? – Marck

+0

En realidad, es una matriz dinámica en lugar de una matriz abierta. Las matrices abiertas solo existen como parámetros de procedimiento. He actualizado el título de la pregunta. –

Respuesta

9

Si bien no hay ningún problema al declarar el diccionario, agregar valores puede ser un poco complicado. Se puede utilizar una construcción especial para obtener la matriz variante requerida:

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

Eso es exactamente lo que quería. Una forma de agregar los elementos de la matriz en una línea sin la necesidad de una función de clase (y la entrada de la cláusula de usos adicionales que se requeriría). ¡Gracias! – reckface

+0

¿Es importante para el tipo genérico en la declaración para que coincida con el uso, o podría la declaración original de Reckface usando el trabajo 'array of Variant' también? –

+1

@Rob Kennedy, no, eso no funcionará. El compilador distingue entre 'TArray ' y 'array of Variant'. –

0

Se puede declarar un tipo de matriz de la variante de hacer más código como usted quiere:

type 
    TDynamicArrayOfVariant = array of Variant; 

var 
    searchDictionary: TDictionary<string, TDynamicArrayOfVariant>; 
begin 
    searchDictionary.Add('BIN_NAME', ['X01%', '%D01']); 
end; 
Cuestiones relacionadas