2

リストボックスがその要素と CompareTo 関数を並べ替える方法の違いに問題があります。

問題は、私は 2 つのリストボックスを使用しており、そのうちの 1 つにのみ発生する要素の 2 つのリストを作成しようとしていることです。両方のリストボックスは、sorted プロパティを使用して並べ替えられます。

私のプログラムはリストボックスを実行し、CompareTo 関数を使用して要素を 1 つずつ比較します。

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

これで、「Donald's Pizza」のように、アポストロフィ (') を含むアイテムを除いて、すべて正常に動作します。

ソートされたリストボックスでは、「Donald's Pizza」が「Donald Duck」の前に表示されます。アポストロフィはスペースよりも小さいです。しかし、CompareTo 関数を使用すると、"Donald's Pizza" は "Donald Duck" より大きくなります。"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;
    }
4

1 に答える 1

1

Microsoftのサイトにあるサンプルの比較ツールは、ListBoxと同じ順序で比較します。したがって、以下のコードは、「DonaldDuck」の前に「Donald'sPizza」を生成します。

  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はここから来て、次のように実装されます。

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

  }
}
于 2012-07-03T04:53:32.083 に答える