스트링 구축 프로그램 및 후행 또는 주요 부울 운영자를 다루는 것
-
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;
}
이제 이것의 문제는 진술이 'and'로 시작한다는 것입니다.
이제 나는 보통 다음으로 마무리합니다.
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
제휴하지 않습니다 StackOverflow