Der Aufbau Zeichenfolge programmatisch und der Umgang mit stechend oder schleppend Booleschen Operatoren

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

  •  05-07-2019
  •  | 
  •  

Frage

Ich verwende Lucene in einer Anwendung. Als solche habe ich eine Form, die von der Auswahl der Benutzer bauen eine Abfrage lässt, was sie von Dropdown-Listen suchen möchten. Sobald ein Benutzer einreicht, baue ich die Abfrage und es kommt darauf an, etwas wie folgt aus:

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;
}

Jetzt mit diesem das Problem ist, dass die Aussage mit ‚AND‘ beginnen

Jetzt in der Regel Ich beende mit:

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

Würden Kerl Programmierer in der Regel lieber tun:

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;
}

Gibt es eine andere Technik Menschen für diese Art der Sache verwenden, mag ich nicht zu denken bin? Ich ziehe das erstere.

War es hilfreich?

Lösung

Es gibt zwei weitere Lösungen, die ich nutze, ein wenig von der Sprache abhängig. Die erste ist ähnlich wie Ihre zweite, sondern nur verändert das „first-Feld“ zu überprüfen.

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";
    }
}

Aber die Lösung, die ich in der Regel verwenden, beinhaltet eine geordnete Liste. Angenommen, ich kann Ihr Beispiel-Code in irgendeiner Weise erweitern, die vernünftig aussieht:

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 ");

Dies hat auch den Vorteil, dass nicht viele unnötigen String Kopien als die Zeichenfolge montieren (in einigen Sprachen, das ist teuer).

Andere Tipps

Ich habe immer die ehemaligen verwendet. Vor allem, weil es mir sieht sauberer.


Ein weiterer Ansatz:

query = first_field_name

for every other field besides first:
    query = " AND " + field_name
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top