스트링 구축 프로그램 및 후행 또는 주요 부울 운영자를 다루는 것

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

이제 이것의 문제는 진술이 '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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top