我正在尝试编写基本搜索,并且部分排序逻辑会根据相同的长度将捕获的关键字长度与返回的结果Substring进行比较。因此,如果关键字是9个字符,则逻辑会搜索每个返回结果的前9个字符,以查找关键字是否与Substring匹配。
我得到的问题是,如果我搜索关键字长度,它声称我在比较关键字的数据的子串索引范围之外,即使返回的唯一结果将在至少包含捕获的关键字长度等。我的代码如下:
@{
string KEYWORDS = !string.IsNullOrEmpty(Request.QueryString["keywords"]) ? Request.QueryString["keywords"] : string.Empty;
var query1 = Query.WhereFullTextContains(KEYWORDS, In.Column("Property_Title", 100), In.Column("MD_Course_UCASCode", 50));
var query2 = Query.WhereFullTextContains(KEYWORDS, In.Column("MD_Course_Departments", 50), In.Column("MD_Course_Departments2", 50));
var search = new NodeFinder().Find(query1);
var search2 = new NodeFinder().Find(query2);
int searchindex = KEYWORDS.Length;
var searchall = search.Union(search2).GroupBy(x => x.Title).Select(y => y.First());
}
@foreach (ContentNode node in searchall) {
if (node.Title.Substring(0, searchindex) == "economics")
{
<div class="sys_subitem">
<div>
<h3><a href="@node.Path">@node.Title</a></h3>
<div>
<dl>
<dt>UCAS Code:</dt>
<dd>@node.Data.Course_UCASCode</dd>
</dl>
</div>
</div>
</div>
}
}
任何想法我可能做错了什么?帮助将不胜感激!
答案 0 :(得分:3)
如果您运行此代码段:
"".Substring(0,9)
输出为ArgumentOutOfRangeException
,消息为&#34;索引和长度必须引用string.Parameter name中的位置:length&#34;。事实上,只要您要求切片的字符串大于您正在搜索的字符串,就会发生这种情况。
所以node.Title
可能发生的事情是空的,或者至少小于您正在搜索的关键字。因此,要解决此问题并使用您当前的方法,您需要将逻辑更改为(node.Title.Length >= searchindex && node.Title.Substring(0, searchindex) == "economics")
。
但是,考虑到您要做的事情,更好的选择可能是String.StartsWith方法。
答案 1 :(得分:0)
很可能Keyword.Length&lt; &#34;经济学&#34 ;.例如,将关键字视为&#34; ECO&#34;。因为,ECO的长度小于经济学的长度,它会引发你ArgumentOutOfRangeException
。此外,由于您也在部门搜索,因此Title可能为null或为空,因此您也应该进行空检查。
您的关键字比较也以0索引开头,关键字是否可能位于Title的中间?示例:Course_Economics。你需要考虑吗?另外,您需要检查字符串CASE吗?
满足上述条件的一个可能条件可能如下:
if (!string.IsNullOrEmpty(node.Title) &&
node.Title.IndexOf("economics", StringComparison.OrdinalIgnoreCase) >= 0) {
//DO Work
}