我有一個名爲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提前
是您的列表排序?因爲你只能在有序列表上使用BinarySearch。 –
另請注意,如果您的比較器提供了兩位藝術家*,其中兩位藝術家都擁有空ID,則它會做錯誤的事情。在這種情況下它應該返回0。 –
該列表是通過讀取ID實際訂購的文件而依次生成的。所以我會說是的。如果這就是你的意思 –