2012-07-03 46 views
2

我遇到了列表框排序其元素和CompareTo函數的方式不同的問題。與listbox.sort和字符串compareto函數的小問題

事情是,我使用兩個列表框,並試圖使兩個元素列表只出現在其中一個列表框中。兩個列表框都使用已排序的屬性進行排序。

我的程序通過列表框運行,並通過一個比較使用的CompareTo功能的要素之一:

if (listBox1.Items[x].ToString().CompareTo(listBox2.Items[y].ToString())) > 0 etc. 

現在,一切工作正常,除了包含一個單引號(')項目 - 像「唐納德比薩」:

在有序列表框中,「唐納德比薩」出現在「唐老鴨」之前。撇號小於空格。 但是使用CompareTo函數,「唐納德比薩」比「唐老鴨」更大。 「CompareTo」說,撇號是比空間大

這混亂了我的系統。

如果我知道這只是導致問題的撇號,我可以很容易地做出解決方法,但現在我不太安全,如果它也可以應用於其他角色。

作爲一個解決方案,我必須對列表框做出自己的排序過程,但是我只是忽略了一些明顯的東西?編輯: 感謝您的答案。

我最終根據CompareTo函數創建了我自己的排序過程。 這樣我確定列表框的排序與我以後使用的CompareTo函數100%相等。

public ListBox fn_sort_listbox(ListBox par_listbox) 
    { 
     ListBox lb_work = new ListBox(); 
     int in_index; 
     int in_compare; 

     if (par_listbox.Items.Count == 0) return lb_work; 

     foreach (object i in par_listbox.Items) 
     { 
      in_index = 0; 
      while (in_index < lb_work.Items.Count) 
      { 
       in_compare = lb_work.Items[in_index].ToString().CompareTo(i.ToString()); 
       if (in_compare > 0) 
       { 
        break; 
       } 
       in_index++; 
      } 
      lb_work.Items.Insert(in_index, i.ToString()); 
     } 

     return lb_work; 
    } 
+0

看到http://social.msdn.microsoft.com/Forums/en-IN/csharpgeneral/thread/6d973127-e861- 4852-b6e8-235607229e45 –

回答

1

微軟網站上的示例比較器按照與列表框相同的順序進行比較。所以下面的代碼在「唐老鴨」之前產生了「唐納德比薩」。

string[] strings = new string[2] { "Donald Duck", "Donald's Pizza" }; 
    Array.Sort(strings, new MyStringComparer(CompareInfo.GetCompareInfo("en-US"), 
     CompareOptions.StringSort)); 
    foreach (string item in strings) 
    Console.WriteLine(item); 

的MyStringComparer來自here和實現爲:

public class MyStringComparer : IComparer 
{ 
    private CompareInfo myComp; 
    private CompareOptions myOptions = CompareOptions.None; 

    // Constructs a comparer using the specified CompareOptions. 
    public MyStringComparer(CompareInfo cmpi, CompareOptions options) 
    { 
    myComp = cmpi; 
    this.myOptions = options; 
    } 

    // Compares strings with the CompareOptions specified in the constructor. 
    public int Compare(Object a, Object b) 
    { 
    if (a == b) return 0; 
    if (a == null) return -1; 
    if (b == null) return 1; 

    String sa = a as String; 
    String sb = b as String; 
    if (sa != null && sb != null) 
     return myComp.Compare(sa, sb, myOptions); 
    throw new ArgumentException("a and b should be strings."); 

    } 
} 
+0

感謝您的回答。 我最終根據CompareTo函數創建了自己的排序過程。通過這種方式,我確信列表框的種類與我稍後使用的CompareTo函數100%相同。 –