Construyendo cadena programáticamente y tratando con operadores booleanos finales o líderes

votos
1

Estoy usando Lucene en una aplicación. Como tal, tengo un formulario que permite a los usuarios crear una consulta seleccionando lo que desean buscar de los menús desplegables. Una vez que un usuario envía, construyo la consulta y se reduce a algo como esto:

var formedQuery= string.Empty;
foreach(var field in fields)
{
    if (field.name != 'condition so you never know which field from fields will be 1st')
        formedQuery +=  AND + field.name + : field.value;
}

Ahora el problema con esto es que la declaración comenzará con 'Y'

Ahora suelo terminar con:

formedQuery = formedQuery.Substring(4) //Trim the first 4 characters

Los programadores compañeros preferirían hacer:

var formedQuery= string.Empty;
var i = false;
foreach(var field in fields)
{
    if (false && 
        field.name != 'condition so you never know which field from fields will be 1st')
    {
        formedQuery +=  AND + field.name + : field.value;
        i = true;
    }
    else
        formedQuery +=   + field.name + : field.value;
}

¿Hay alguna otra técnica que la gente quiera usar para este tipo de cosas en las que no estoy pensando? Prefiero el primero.

Publicado el 30/07/2009 a las 00:40
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
0

Siempre he usado el primero. Principalmente porque me parece más limpio.


Otro enfoque:

query = first_field_name

for every other field besides first:
    query = " AND " + field_name
Respondida el 30/07/2009 a las 00:49
fuente por usuario

votos
1

Hay otras dos soluciones que uso, dependiendo un poco del idioma. La primera es similar a la segunda, pero simplemente cambia la verificación de "primer campo".

var formedQuery = string.Empty;
var and = string.Empty;
foreach(var field in fields)
{
    if (field.name != 'condition so you never know which field from fields will be 1st')
    {
        formedQuery += and + field.name + ":" field.value;
        and = " AND";
    }
}

Pero la solución que suelo usar implica una lista ordenada. Asumiendo que puedo extender tu código de ejemplo de alguna manera que parezca razonable:

var formedQuery = list.Empty;
foreach(var field in fields)
{
    if (field.name != 'condition so you never know which field from fields will be 1st')
    {
        formedQuery.push(field.name + ":" field.value);
    }
}
formedQuery = formedQuery.join(" AND ");

Esto también tiene la ventaja de no hacer muchas copias de cadenas innecesarias a medida que ensambla la cadena (en algunos idiomas, esto es costoso).

Respondida el 30/07/2009 a las 00:51
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more