2016-06-12 54 views
0

我正在嘗試編寫基本搜索,並且排序邏輯的一部分將捕獲的關鍵字長度與基於相同長度的返回結果子字符串進行比較。因此,如果關鍵字爲9個字符,則邏輯會搜索每個返回結果的前9個字符,以查找關鍵字是否與子字符串匹配。子串異常

我得到的問題是,如果我搜索關鍵字的長度,它聲稱我的數據的字符串索引超出範圍,我比較關鍵字,即使返回的唯一結果將在至少包含捕獲的關鍵字長度和更多。我的代碼如下:

@{ 
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> 
    } 
} 

任何想法我可能做錯了什麼?幫助將不勝感激!

回答

3

如果你運行該代碼片段:

"".Substring(0,9) 

輸出爲ArgumentOutOfRangeException消息「索引和長度必須引用位置string.Parameter名稱中:長」。事實上,這將發生在任何時候,你要求的字符串比你正在搜索的字符串更大。

因此,可能發生的事情是node.Title是空的或者至少比關鍵字'重新尋找。所以,要解決這個問題並使用您當前的方法,您需要將您的邏輯更改爲(node.Title.Length >= searchindex && node.Title.Substring(0, searchindex) == "economics")

但是,考慮到您正在嘗試做什麼,更好的選擇可能是String.StartsWith方法。

+0

我試圖StartsWith,它暴露了'node.Title'具有扔在一些成果除外一些有趣的屬性,由於這個事實! – doats1

0

這很可能是Keyword.Length <「經濟學」。例如,將關鍵字視爲「ECO」。因爲ECO的長度小於經濟的長度,所以它會拋出你ArgumentOutOfRangeException。此外,由於您也在Department上搜索,因此Title可能爲空或空,因此您還應該執行空檢查。

您的關鍵字比較也以0索引開頭,關鍵字是否可能位於標題中間?例如:課程_經濟學。你需要考慮嗎?另外,你是否需要檢查字符串CASE?

一個滿足上述條件的可能條件可能是以下:

if (!string.IsNullOrEmpty(node.Title) && 
node.Title.IndexOf("economics", StringComparison.OrdinalIgnoreCase) >= 0) { 
    //DO Work 
} 
+0

長度肯定是一樣的長度;該節點基於自定義庫,因此它不像我想象的那樣簡單,而StartsWith是一種更簡單的方法。感謝您的貢獻! – doats1