Построение строки программно и работа с конечными или ведущими логическими операторами - PullRequest
1 голос
/ 30 июля 2009

Я использую Lucene в приложении. Таким образом, у меня есть форма, которая позволяет пользователям создавать запросы, выбирая то, что они хотят искать из выпадающих списков. Когда пользователь отправляет запрос, я создаю запрос, и он сводится к следующему:

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

Теперь проблема в том, что утверждение будет начинаться с 'И'

Теперь я обычно заканчиваю:

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

Предпочитают ли коллеги-программисты:

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

Есть ли другая техника, которую люди любят использовать для такого рода вещей, о которых я не думаю? Я предпочитаю первое.

Ответы [ 2 ]

1 голос
/ 30 июля 2009

Есть два других решения, которые я использую, в зависимости от языка. Первый аналогичен второму, но просто изменяет проверку «первого поля».

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

Но решение, которое я обычно использую, включает упорядоченный список. Предполагая, что я могу расширить ваш пример кода любым удобным для вас способом:

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

Это также имеет то преимущество, что вы не делаете много ненужных копий строк при сборке строки (в некоторых языках это дорого).

0 голосов
/ 30 июля 2009

Я всегда использовал первое. В основном потому, что для меня это выглядит чище.


Другой подход:

query = first_field_name

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