c# - List<T> 上的 BinarySearch 似乎返回了奇怪的结果

标签 c# collections binary-search

我是 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);
}

关于c# - List<T> 上的 BinarySearch 似乎返回了奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21684324/

相关文章:

c# - Web Api 在发生异常时总是返回 http 状态码 200

c# - List.Contains 在迭代 foreach 循环时不起作用

c# - 将 JSON 日期解析为 C# DateTime

java - 为什么没有 ArrayList(T[] t) 构造函数?

java - 当 HashMap 或 HashSet 达到最大容量时会发生什么?

algorithm - 如何确定二进制搜索中的边界或迭代次数?

c# - C#调用BeginInvoke/Invoke时如何获取返回值

dictionary - Java 8 将 Map<Department, List<Person>> 转换为 Map<Department, List<String>>

有人可以解释为什么它不会执行我的二分搜索中的最后一个 else if 语句吗

java - 二分查找无法正确运行