C#使用比较器进行二进制搜索的对象列表

时间:2014-02-22 23:06:54

标签: c# list binary-search

我有一个名为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 提前谢谢

1 个答案:

答案 0 :(得分:3)

您需要在BinarySearch之前对列表进行排序,请参阅documentation

  

使用指定的比较器搜索元素的整个排序列表,并返回元素的从零开始的索引。

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

此外,您应该在SortBinarySearch中使用相同的比较器才能使其正常工作