List<T>上的二进制搜索似乎返回奇怪的结果 [英] BinarySearch on List<T> seems to be returning strange result

查看:0
本文介绍了List<T>上的二进制搜索似乎返回奇怪的结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对C#非常陌生。我已经创建了一个List对象,然后正在对特定项目执行BinarySearch。但搜索结果似乎很奇怪。代码如下:

class Element
{
    public int x;
    public Element(int val) { x = val; }
}
class MyContainer : IComparable<MyContainer>
{
    public Element elem;
    public MyContainer(int val) { elem = new Element(val); }
    public MyContainer(Element e) { elem = e; }
    public int CompareTo(MyContainer obj)
    {
        if (elem.x < obj.elem.x) { return -1; }
        else if (elem.x == obj.elem.x) { return 0; }
        else { return 1; }
    }
}
class Program
{
    static void Main(string[] args)
    {
        MyContainer container1 = new MyContainer(100);
        MyContainer container2 = new MyContainer(21);
        MyContainer container3 = new MyContainer(-122);
        Element elemObj = new Element(-122);

        List<MyContainer> list = new List<MyContainer>();
        list.Add(new MyContainer(80));
        list.Add(container1);
        list.Add(container2);
        list.Add(container3);
        list.Add(new MyContainer(90));
        foreach(MyContainer c in list)  Console.WriteLine(c.elem.x);

        if (list.Contains(container3) == true) Console.WriteLine("present");
        else Console.WriteLine("NOT present");
        Console.WriteLine("Search result:::"+list.BinarySearch(new MyContainer(elemObj)));
        Console.WriteLine("Search result:::" + list.BinarySearch(container1));
        Console.WriteLine("Search result:::" + list.BinarySearch(container2));
        Console.WriteLine("Search result:::" + list.BinarySearch(container3));
    }
}

输出如下:

80
100
21
-122
90
present
Search result:::-1
Search result:::-6
Search result:::2
Search result:::-1

为什么只找到与值21对应的元素,而没有找到其他元素

推荐答案

您的列表一开始就没有排序。对原始输入进行排序时,对分搜索有效。关键是,您知道如果list[x] = y,则list[a] <= y全部a < xlist[a] >= y全部a > x

因此,您要么需要首先对列表进行排序,要么需要选择不同的搜索方式(例如,使用单独的基于散列的词典,或仅执行线性搜索)。

还请注意,您的CompareTo方法可以更简单地实现:

public int CompareTo(MyContainer obj)
{
    return elem.x.CompareTo(obj.elem.x);
}

这篇关于List&lt;T&gt;上的二进制搜索似乎返回奇怪的结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆