問題:
特定の文字列形式 (例: 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 サイトの他の関連記事を参照してください。