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

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

Linda Hamilton
リリース: 2025-01-01 04:11:10
オリジナル
328 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート