2014-01-31 26 views
0

我正在做家庭作業,除二進制搜索外,一切工作。當程序執行時,我在Friend temp =(Friend)o中得到以下錯誤;的IComparable:InvalidCastException未被用戶代碼處理。無法投射'System.String'類型的對象來鍵入'FriendList.Friend'。我可以使用幫助來查明我誤導的地方。提前致謝。BinarySearch錯誤導致InvalidCastException

using System; 

using System.Linq; 

namespace FriendList 
{ 
public static class FriendList 
{   
    public static void Main() 
    { 
     var findname = "";    
      var friends = new Friend[8]; 

      for (var i = 0; i < 8; i++) 
      { 
       Console.Write("Enter a name (or type quit to skip): "); 
       var name = Console.ReadLine(); 
       if (name.ToLower() == "quit") 
       { 
        return; 
       } 

       Console.Write("Enter a phone number: "); 
       var phone = Console.ReadLine(); 

       Console.Write("Enter a birth month number: "); 
       var month = Console.ReadLine(); 

       Console.Write("Enter a birth day: "); 
       var day = Console.ReadLine(); 

       Console.Write("Enter a birth year: "); 
       var year = Console.ReadLine(); 

       friends[i] = new Friend 
       { 
        Name = name, 
        Phone = phone, 
        Month = Convert.ToInt32(month), 
        Day = Convert.ToInt32(day), 
        Year = Convert.ToInt32(year) 
       }; 
      } 

       Array.Sort(friends); 

       for (int x = 0; x < 8; ++x) 
       { 
        Console.Write("{0} {1} {2}{3}{4}", friends[x].Name, friends[x].Phone, friends[x].Month, friends[x].Day, friends[x].Year); 
        Console.Write("\n"); 
       } 

       Console.ReadKey(); 

       var findfriends = new Friend(); 
       Console.Write("Enter the name you want for info:");    
       findname = Console.ReadLine(); 

       for (int x = 0; x < 8; ++x) 
       { 
        x = Array.BinarySearch(friends, findname); 
        Console.Write("{0} {1} {2}{3}{4}", friends[x].Name, friends[x].Phone, friends[x].Month, friends[x].Day, friends[x].Year); 
       } 
     } 
    } 


    class Friend : IComparable 
    { 
     public string Name { get; set; } 
     public string Phone { get; set; } 
     public int Month { get; set; } 
     public int Day { get; set; } 
     public int Year { get; set; } 

     public Friend() 
     { } 

     int IComparable.CompareTo(Object o) 
     { 
      Friend temp = (Friend)o; 
      return String.Compare(this.Name, temp.Name);    
     } 
    } 
} 
+2

你應該實現IComparable接口''代替。 – SLaks

回答

0

問題是您正在嘗試對類型爲Friend的數組執行二進制搜索以查找字符串值。所以當你的ICompare實現試圖將這個名字強制轉換爲朋友時,它會拋出你所看到的異常。要正確使用ICompare你需要創建一個新的臨時好友對象傳遞到二進制搜索,但剛纔設置的名稱,像這樣:

Array.BinarySearch(friends, new Friend(){ Name = findName });

+0

謝謝你糾正我的錯誤。有一次,我創建了一個新的朋友對象,但正如我現在看到的,我沒有正確實施它。我也錯誤地使用循環,所以我刪除了它,它的工作完美。 –

0

當你調用

x = Array.BinarySearch(friends, findname); 

你傳遞findname,它是字符串。這裏:

Friend temp = (Friend)o; 

你試圖把這個字符串強制轉換成Friend類。