문제:
특정 문자열 형식(예: 200906/1)의 송장 번호를 포함하는 속성이 있는 개체 목록이 있습니다. C#에서 Linq OrderBy의 기본 정렬로 인해 200906/1, 200906/10, 200906/11과 같은 바람직하지 않은 정렬 순서가 발생합니다.
해결책:
To 자신만의 사용자 정의 정렬 순서를 구현하면 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!