Ejemplo:
&esta = Boolean.FalseEsto no parece ser lo más elegante... No debería necesitar 7 líneas de código para saber si un elemento está en la colección, lo debería poder hacer en una sola línea.
for &depUbiItem in &depUbis
if &depUbiItem.DepId = &DepId and &depUbiItem.CicUbiId = &CicUbiId
&esta = Boolean.True
exit
endif
endfor
El problema es que dado un SDT, GeneXus no tiene forma de saber cuales son los elementos que quiero comparar. En el ejemplo, estoy comparando DepId y CicUbiId, pero el SDT tiene varios campos más.
Una posibilidad sería poder definirle comportamiento a los SDTs, de forma de poder decirle cual es la función de comparación que tengo que usar. Esta función de comparación se definiría una vez para el SDT, y siempre que se quiera buscar un elemento se haría usando este comparador.
Otra opción que me gustaría más, es poder definir on-line la función de comparación. En C# por ejemplo, usando lambda expressions, quedaría algo así:
bool esta = depUbis.Exists(d => ((d.DepId = depId) && (d.CicUbiId = cicUbiId)));O escribiendolo como me gustaría verlo en GeneXus:
&esta = &depUbis.Exists(d => d.DepId = &DepId and d.CicUbiId = &CicUbiId)Esto se lee "existe un elemento d en la colección &depUbis que cumple que d.DepId = &DepId y d.CicUbiId = &CicUbiId".
Las colecciones en C# definen otras funciones que también sería intereante tener, como ser:
- First: devuelve el primer elemento que cumple con la condición
- Where: devuelve otra colección con los elementos que cumplen con la condición
- Select: permite hacer una proyección, devuelve otra colección pero de otro tipo
8 comentarios: