2016-12-15 79 views
1

無法將此二進制搜索結果轉換爲int。所有的代碼都能正常工作。我想獲取一個名稱並顯示json實例化的內容。我已經安排好了。謝謝c#二分查找方法「未處理的異常:System.IndexOutOfRangeException:」

「未處理的異常:System.IndexOutOfRangeException:索引超出了數組的範圍。」

static void SearchEntity(Entity[] entities) 
    { 
      Entities result = new Entities(); 
      Console.WriteLine("Which name to find "); 
      string userInput = Console.ReadLine(); 
      string[] title = new string[10000]; 

//------------- 
      Console.Write("Search Keyword : "); 
      string searchKeyword = Console.ReadLine(); 
      if (userInput.ToLower() == "title") 
      { 
       title = entities.Select(m => m.Title).ToArray(); 

       Array.Sort(title); 
       Sorting.Sort(entities, userInput);             

       var tmp = Array.BinarySearch<string>(title, userInput); 



       if (Convert.ToInt32(tmp) == -1) 
       { 
        Console.WriteLine("No data found!"); 
        return; 
       } 
       result = entities[Convert.ToInt32(tmp)]; 
       entitiesPrint(result); 
      } 
+1

什麼行nbr ??? –

+1

查看BinarySearch的文檔以瞭解它是如何工作的。它返回一個'int'。 「int」可以是任何負數,而不僅是-1。 –

+0

我必須問,爲什麼在這裏使用二進制搜索?它們對已經排序好的數組效果最好,但如果在執行搜索之前必須手動對數組進行排序,則會失去性能優勢。 – Abion47

回答

1

Array.BinarySearch文檔:

指定數組中指定的值的索引,如果值被發現;否則,一個負數。如果未找到值並且值小於數組中的一個或多個元素,則返回的負數是大於值的第一個元素的索引的按位補數。如果未找到值並且值大於數組中的所有元素,則返回的負數是(最後一個元素的索引加1)的按位補數。如果使用非排序數組調用此方法,則即使值存在於數組中,返回值也可能不正確,並且可能返回負數。

如果找不到確切的值,該方法可以返回各種負數,而不僅僅是-1。你將要改用以下內容:

if (tmp < 0) 
    // ... 

另外值得一提的是,Array.BinarySearch返回int了,所以調用Convert.ToInt32是多餘的。