Построение строки программно и работа с конечными или ведущими логическими операторами

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

  •  05-07-2019
  •  | 
  •  

Вопрос

Я использую 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;
}

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

Это было полезно?

Решение

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

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

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

Другие советы

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

<Ч>

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

query = first_field_name

for every other field besides first:
    query = " AND " + field_name
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top