Costruire una stringa a livello di codice e gestire i trailing o i principali operatori booleani
-
05-07-2019 - |
Domanda
Sto usando Lucene in un'applicazione. Come tale, ho un modulo che consente agli utenti di creare una query selezionando ciò che desiderano cercare dai menu a discesa. Una volta che un utente invia, creo la query e si riduce a qualcosa del genere:
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;
}
Ora il problema è che la frase inizierà con "AND"
Ora di solito finisco con:
formedQuery = formedQuery.Substring(4) //Trim the first 4 characters
Di solito i compagni programmatori preferiscono fare:
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;
}
C'è un'altra tecnica che le persone amano usare per questo genere di cose a cui non sto pensando? Preferisco il primo.
Soluzione
Ci sono altre due soluzioni che utilizzo, a seconda della lingua. Il primo è simile al secondo, ma cambia semplicemente il "primo campo" controllare.
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";
}
}
Ma la soluzione che utilizzo di solito prevede un elenco ordinato. Supponendo di poter estendere il tuo codice di esempio in qualsiasi modo sembri sensato:
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 ");
Ciò ha anche il vantaggio di non creare molte copie di stringhe non necessarie mentre assemblate la stringa (in alcune lingue, è costosa).
Altri suggerimenti
Ho sempre usato il primo. Soprattutto perché mi sembra più pulito.
Un altro approccio:
query = first_field_name
for every other field besides first:
query = " AND " + field_name