Création de chaîne par programme et prise en charge des opérateurs booléens en queue ou en tête

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

  •  05-07-2019
  •  | 
  •  

Question

J'utilise Lucene dans une application. En tant que tel, j'ai un formulaire qui permet aux utilisateurs de créer une requête en sélectionnant ce qu'ils veulent rechercher dans les listes déroulantes. Une fois qu'un utilisateur a soumis, je construis la requête et elle se résume à ceci:

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

Le problème avec ceci est que l'instruction commence par "ET"

Maintenant, je termine habituellement par:

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

Les autres programmeurs préféreraient-ils généralement faire:

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-t-il une autre technique que les gens aiment utiliser pour ce genre de chose à laquelle je ne pense pas? Je préfère l'ancien.

Était-ce utile?

La solution

J'utilise deux autres solutions, qui dépendent un peu de la langue. Le premier est similaire au second, mais il ne change que le "premier champ". vérifier.

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

Mais la solution que j'utilise habituellement implique une liste ordonnée. En supposant que je puisse étendre votre exemple de code d’une manière qui semble raisonnable:

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

Cela présente également l’avantage de ne pas créer beaucoup de copies de chaîne inutiles car vous assemblez la chaîne (dans certaines langues, cela coûte cher).

Autres conseils

J'ai toujours utilisé l'ancien. Principalement parce que ça me semble plus propre.

Une autre approche:

query = first_field_name

for every other field besides first:
    query = " AND " + field_name
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top