ホームページ >バックエンド開発 >C++ >Linq OrderBy でカスタム IComparer を使用してリストを正しく並べ替える方法

Linq OrderBy でカスタム IComparer を使用してリストを正しく並べ替える方法

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-01 04:11:10356ブラウズ

How to Correctly Sort a List Using a Custom IComparer with Linq OrderBy?

カスタム IComparer の使用 Linq OrderBy

問題

汎用 List があります。ここで、MyClass には、200906/1 のような値を持つ InvoiceNumber プロパティが含まれています。カスタム IComparer を使用したいと考えています。リストを特定の順序で並べ替えます。ただし、カスタム比較子を使用すると、リストは依然として正しく並べ替えられません。

回答

コードには 2 つの問題があります:

  1. 指定したカスタム比較子は数値を正しく並べ替えません。 InvoiceNumber の値を数値に変換し、その数値に基づいて並べ替える必要があります。
  2. BindingList は更新されていません。仕分けされたアイテムと一緒に。リストを並べ替えた後、並べ替えたリストを BindingList の Items プロパティに割り当てる必要があります。

修正されたカスタム比較子は次のとおりです。

public class MyComparer : IComparer<Object>
{

    public int Compare(Object stringA, Object stringB)
    {
        string[] valueA = stringA.ToString().Split('/');
        string[] valueB = stringB.ToString().Split('/');

        if (valueA.Length != 2 || valueB.Length != 2)
        {
            return String.Compare(stringA.ToString(), stringB.ToString());
        }

        // Note: do error checking and consider i18n issues too :)
        if (valueA[0] == valueB[0]) {
          return int.Parse(valueA[1]).CompareTo(int.Parse(valueB[1]));
        } else {
          return int.Parse(valueA[0]).CompareTo(int.Parse(valueB[0]));
        }
    }

}

そして、ここにあります。 BindingList:

case ListSortDirection.Ascending:
    MyComparer comparer = new MyComparer();
    items = items.OrderByDescending(x => property.GetValue(x), comparer).ToList();
    break;
default:
    // Handle descending sort direction here
    break;
}

this.Items = items;
を更新するための修正されたコードです。

以上がLinq OrderBy でカスタム IComparer を使用してリストを正しく並べ替える方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。