ホームページ >バックエンド開発 >C++ >カスタム IComparer を使用して LINQ OrderBy でオブジェクトを正しく並べ替えるにはどうすればよいですか?

カスタム IComparer を使用して LINQ OrderBy でオブジェクトを正しく並べ替えるにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-02 17:44:08700ブラウズ

How Can I Use a Custom IComparer to Correctly Sort Objects in LINQ OrderBy?

カスタム IComparer の使用 Linq OrderBy の場合

問題:

特定の文字列形式 (例: 200906/1) の請求書番号を含むプロパティを持つオブジェクトのリストがあります。 C# の Linq OrderBy のデフォルトの並べ替えでは、200906/1、200906/10、200906/11 などの望ましくない並べ替え順序になります。

解決策:

独自のカスタム並べ替え順序を実装するには、 IComparerインターフェースの実装。以下にサンプル実装を示します。

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 stringA.ToString().CompareTo(stringB.ToString());
        }

        // Parse numbers for comparison
        int numA = int.Parse(valueA[0]);
        int numB = int.Parse(valueB[0]);
        if (numA == numB) 
        {
            return int.Parse(valueA[1]).CompareTo(int.Parse(valueB[1]));
        }
        else
        {
            return numA.CompareTo(numB);
        }
    }
}

元のコードでは、次のように Linq OrderBy で MyComparer を使用しようとしました。

items = items.OrderByDescending(
  x => property.GetValue(x), comparer).ToList();

このアプローチは正しくありません。比較子を使用するための正しい構文は次のとおりです。

items = items.OrderBy(x => property.GetValue(x), comparer).ToList();

昇順で並べ替える場合は、OrderByDescending の代わりに OrderBy メソッドが使用されることに注意してください。

最後に、次のことを忘れないでください。並べ替えられたアイテムをデータ ソースに割り当てて、UI の変更を反映します:

this.Items = items;

以上がカスタム IComparer を使用して LINQ OrderBy でオブジェクトを正しく並べ替えるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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