1

我在应用程序中使用 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;
}

人们是否喜欢使用另一种技术来处理我没有想到的这种事情?我更喜欢前者。

4

2 回答 2

1

我使用了另外两种解决方案,具体取决于语言。第一个类似于您的第二个,但只是更改了“第一个字段”检查。

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

这还具有在您组装字符串时不会制作大量不必要的字符串副本的优点(在某些语言中,这很昂贵)。

于 2009-07-29T23:51:33.820 回答
0

我一直使用前者。主要是因为它对我来说看起来更干净。


另一种方法:

query = first_field_name

for every other field besides first:
    query = " AND " + field_name
于 2009-07-29T23:49:52.980 回答