2014-02-22 125 views
1

我有一個名爲Artist的對象。C#使用比較器進行二進制搜索的對象列表

public class Artist 
{ 
    public string artistID { get; set; } 
    public string artistName { get; set; } 

    public Artist(string artistID, string artistName) 
    { 
     this.artistID = artistID; 
     this.artistName = artistName; 

    } 

    public Artist() 
    { 
    } 
    public Artist(string artistID) 
    { 
     this.artistID = artistID; 
    } 

其中有一個自定義比較是這樣的:

public class CompareArtists : IComparer<Artist> 
{ 

    public int Compare(Artist x, Artist y) 
    { 
     if (x.artistID == null) return -1; 
     if (y.artistID == null) return 1; 

    return String.Compare(x.artistID, y.artistID); 
    } 

} 

我想看到一個藝術家是否包含在主程序我的藝術家名單。而我做的是這樣的:

Artist tempArtist = new Artist(user[1]); 
Artist result = new Artist(); 

position = artists.BinarySearch(tempArtist, dc); 
result = artists.ElementAt(position); 
         users.ElementAt(counter).favoriteArtists.Add(result,Int32.Parse(user[2])); 

中的binarySearch的結果,是一個負數,從我在MSDN上閱讀,是第二大指數的補充。當沒有找到結果時顯示。不過,我百分之百確定我在藝術家名單中搜索的項目確實存在於此。 當我使用線性方法,例如單個或藝術家。找到,我得到一個結果。

您是否發現我的比較器或使用二分查找的方式有問題?

ps:dc是我的比較器:比較藝術家dc = new CompareArtists(); 和user []是從我用流讀取器讀取的行分割的字符串數組。它cotains在[1] 感謝藝術家ID提前

+2

是您的列表排序?因爲你只能在有序列表上使用BinarySearch。 –

+0

另請注意,如果您的比較器提供了兩位藝術家*,其中兩位藝術家都擁有空ID,則它會做錯誤的事情。在這種情況下它應該返回0。 –

+0

該列表是通過讀取ID實際訂購的文件而依次生成的。所以我會說是的。如果這就是你的意思 –

回答

2

您需要BinarySearch之前排序列表,請參閱documentation

搜索的整個使用指定的比較和回報進行排序名單元素元素的從零開始的索引。

artists.Sort(new CompareArtists()); 
position = artists.BinarySearch(tempArtist, dc); 

你也應該在Sort使用相同的比較器和BinarySearch,使其工作

+0

你是對的,我想象到,因爲這個列表是按順序生成的,所以它實際上是有序的。但是在排序藝術家列表時,我的代碼起作用。 我很困惑,但它的工作原理。 –

+0

快速跟進。實際上,我將它們作爲字符串進行比較,在我的順序生成中,它們被定義爲整數。作爲字符串,排序是不同的。這就是爲什麼它不起作用。 –