2016-12-15 50 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是多余的。