Построение строки программно и работа с конечными или ведущими логическими операторами
-
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