Costruire una stringa a livello di codice e gestire i trailing o i principali operatori booleani

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

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

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top