listbox.sort和string compareto-function的小问题

时间:2012-07-03 03:30:39

标签: c# sorting listbox compareto

我在列表框对其元素和CompareTo函数进行排序方面存在差异。

问题是,我正在使用两个列表框,并尝试在其中一个列表框中生成两个元素列表。两个列表框都使用sorted属性进行排序。

我的程序在列表框中运行,并使用CompareTo函数逐个比较元素:

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

现在,一切正常,除了包含撇号(')的项目 - 就像“唐纳德披萨”一样:

在排序列表框中,“Donald's Pizza”出现在“唐老鸭”之前。撇号小于空格。 但是使用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;
    }

1 个答案:

答案 0 :(得分:1)

Microsoft网站上的示例比较器与ListBox的顺序相同。所以下面的代码在“唐老鸭”之前制作了“唐纳德比萨饼”。

  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.");

  }
}