Het bouwen snaar programmatisch en het omgaan met het slepen of leidende Booleaanse operatoren

stemmen
1

Ik ben met behulp van Lucene in een applicatie. Als zodanig heb ik een formulier waarmee gebruikers het bouwen van een vraag door te selecteren wat ze willen te zoeken van dropdowns. Zodra een gebruiker indient, bouw ik de query en het komt neer op iets als dit:

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

Nu is het probleem met dit is dat de verklaring zal beginnen met 'AND'

Nu ik klaar ben meestal met:

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

Zou collega-programmeurs meestal de voorkeur aan te doen:

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

Is er een andere techniek die mensen willen gebruiken voor dit soort dingen denk ik niet van? Ik geef de voorkeur de eerste.

De vraag is gesteld op 30/07/2009 om 00:40
bron van user
In andere talen...                            


2 antwoorden

stemmen
0

Ik heb altijd gebruik gemaakt van de eerstgenoemde. Vooral omdat het ziet er schoner voor mij.


Een andere benadering:

query = first_field_name

for every other field besides first:
    query = " AND " + field_name
antwoordde op 30/07/2009 om 00:49
bron van user

stemmen
1

Er zijn twee andere oplossingen die ik gebruik, afhankelijk van een beetje aan de taal. De eerste is vergelijkbaar met uw tweede, maar verandert de "first-field" check.

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

Maar de oplossing die ik gebruik meestal gaat om een ​​geordende lijst. Ervan uitgaande dat ik kan uw voorbeeld code uit te breiden op een manier die verstandig lijkt:

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

Dit heeft ook het voordeel van het niet maken van veel onnodige snaar exemplaren als je de montage van de string (in sommige talen, dit is duur).

antwoordde op 30/07/2009 om 00:51
bron van user

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