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