Der Aufbau Zeichenfolge programmatisch und der Umgang mit stechend oder schleppend Booleschen Operatoren
-
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.
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