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