Construção corda programaticamente e lidar com final ou levando operadores booleanos
-
05-07-2019 - |
Pergunta
Eu estou usando Lucene em um aplicativo. Como tal, eu tenho um formulário que permite aos usuários criar uma consulta, seleccionando o que eles querem para busca de menus suspensos. Uma vez que um usuário envia, eu construo a consulta e se trata de algo como isto:
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;
}
Agora o problema com isto é que a declaração vai começar com 'E'
Agora eu normalmente terminar com:
formedQuery = formedQuery.Substring(4) //Trim the first 4 characters
Would colegas programadores geralmente preferem fazer:
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;
}
Existe outra técnica pessoas gostam de usar para esse tipo de coisa que eu não estou pensando? Eu prefiro a primeira.
Solução
Existem duas outras soluções que eu usar, dependendo um pouco sobre a linguagem. O primeiro é semelhante ao seu segundo, mas apenas altera a verificação de "first-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";
}
}
Mas a solução que eu geralmente uso envolve uma lista ordenada. Supondo que eu pode estender o seu código de exemplo de qualquer maneira que parece sensata:
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 ");
Isto também tem a vantagem de não fazer muitas cópias de cordas desnecessários como seu montar a string (em algumas línguas, isso é caro).
Outras dicas
Eu usei sempre o primeiro. Principalmente porque ele parece mais limpo para mim.
Outra abordagem:
query = first_field_name
for every other field besides first:
query = " AND " + field_name