我在列表框对其元素和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;
}
答案 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.");
}
}