2009-07-29 4 views
1

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 à partir de listes déroulantes. Une fois qu'un utilisateur soumet, je construis la requête et il se résume à quelque chose comme ceci:Création d'une chaîne par programme et traitement des opérateurs booléens finaux ou principaux

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 a-t-il une autre technique que les gens aiment utiliser pour ce genre de choses auxquelles je ne pense pas? Je préfère le premier.

Répondre

1

Il existe deux autres solutions que j'utilise, selon un peu la langue. La première est similaire à la seconde, mais change simplement la vérification du "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).

+0

J'aime beaucoup votre deuxième voie! – Matt

0

J'ai toujours utilisé le premier. Surtout parce que ça me semble plus propre.


Une autre approche:

query = first_field_name 

for every other field besides first: 
    query = " AND " + field_name 
Questions connexes