Construção corda programaticamente e lidar com final ou levando operadores booleanos

StackOverflow https://stackoverflow.com/questions/1203675

  •  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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top