我有一个名为Artist的对象。
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;
}
哪个有这样的自定义Comparer:
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]));
二进制搜索的结果是一个负数,它是我在MSDN上读到的,是下一个最大索引的补充。并且在没有找到结果时显示。但是,我100%确定我在艺术家列表中搜索的项目确实存在。 当我使用线性方法时,例如artists.Single或artists.Find,我得到了一个结果。
您认为我的比较器或我使用二进制搜索的方式有什么问题吗?
ps:dc是我的比较器:CompareArtists dc = new CompareArtists(); user []是一个字符串数组,从我用流阅读器读取的行中拆分。它在[1]中包含了艺术家ID 提前谢谢
答案 0 :(得分:3)
您需要在BinarySearch
之前对列表进行排序,请参阅documentation
使用指定的比较器搜索元素的整个排序列表,并返回元素的从零开始的索引。
artists.Sort(new CompareArtists());
position = artists.BinarySearch(tempArtist, dc);
此外,您应该在Sort
和BinarySearch
中使用相同的比较器才能使其正常工作