chaîne Construire programatically et traitant de fuite ou les principaux opérateurs booléens

voix
1

J'utilise Lucene dans une application. En tant que tel, j'ai une forme qui permet aux utilisateurs de créer une requête en sélectionnant ce qu'ils veulent à la recherche de menus déroulants. Une fois qu'un utilisateur soumet, je construis la requête et il se résume à quelque chose comme 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;
}

Maintenant, le problème est que la déclaration commencera par « ET »

Maintenant, je finis habituellement avec:

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

Est-ce que les programmeurs autres préfèrent 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;
}

Y at-il un autre peuple technique aiment à utiliser pour ce genre de chose que je ne pense pas à? Je préfère l'ancien.

Créé 30/07/2009 à 00:40
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

J'ai toujours utilisé l'ancien. La plupart du temps, car il semble me plus propre.


Une autre approche:

query = first_field_name

for every other field besides first:
    query = " AND " + field_name
Créé 30/07/2009 à 00:49
source utilisateur

voix
1

Il existe deux autres solutions que j'utilise, selon un peu la langue. La première est similaire à votre deuxième, mais change juste le chèque « premier-champ ».

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 peux prolonger votre code d'exemple d'une façon 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 a aussi l'avantage de ne pas faire beaucoup de copies de chaînes inutiles comme assembler la chaîne (dans certaines langues, cela coûte cher).

Créé 30/07/2009 à 00:51
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more