2014-02-10 41 views
5

我對C#很新。我創建了一個List對象,然後我在一個特定的項目上執行BinarySearch。但搜索結果似乎很奇怪。下面是代碼:BinarySearch列表<T>似乎返回奇怪的結果

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中的元素,爲什麼不把別人

回答

9

您的列表沒有排序開始。二進制搜索只有在原始輸入被排序時起作用。總的來說,你知道如果全部list[x] = y,然後list[a] <= y全部a < xlist[a] >= y全部​​。因此,無論您需要首先對列表進行排序,還是需要選擇不同的搜索方式(例如,使用單獨的基於散列的字典,或者僅執行線性搜索)。

另外請注意,您CompareTo方法可以更簡單地實現了很多:

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

一個BinarySearch只能排序列表上。由於您的列表未按照應有的方式排序,因此它可能會正確或無法正確找到結果。您可以通過sorting先解決這個問題:

list.Add(new MyContainer(90)); 
// after adding all elements 
list.Sort(); 
foreach(MyContainer c in list) Console.WriteLine(c.elem.x); 
+0

哦! thanx爲您的答覆 – user3282758