C#에서 LINQ의 OrderBy 메서드를 사용하면 지정된 속성이나 표현식을 기반으로 데이터를 정렬할 수 있습니다. 하지만 정렬할 속성이나 표현식을 동적으로 지정하려면 어떻게 해야 할까요?
질문:
매개변수가 주어지면 지정된 속성을 기준으로 학생 목록을 정렬하려고 하지만 현재 OrderBy 호출의 속성 이름이 하드코딩되어 있습니다.
예:
<code class="language-csharp">List<Student> existingStudents = new List<Student> { new Student { ... }, new Student { ... } }; List<Student> orderByAddress = existingStudents.OrderBy(c => c.Address).ToList();</code>
타겟:
OrderBy에서 정적 속성 이름을 사용하는 대신 속성 이름을 매개변수로 사용하고 싶습니다.
예:
<code class="language-csharp">string param = "City"; List<Student> orderByCity = existingStudents.OrderBy(c => c.City).ToList(); //仍然需要明确指定属性</code>
해결책:
리플렉션을 사용하여 OrderBy 표현식을 동적으로 구성할 수 있습니다.
<code class="language-csharp">public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string orderByProperty, bool desc) { // ... (反射代码构建表达式树) ... return source.Provider.CreateQuery<T>(resultExpression); }</code>
그런 다음 지정된 속성을 기준으로 동적으로 정렬할 수 있습니다.
<code class="language-csharp">existingStudents.OrderBy("City", true); // 降序 existingStudents.OrderBy("City", false); // 升序</code>
(참고: 전체 리플렉션 코드 구현은 더 복잡하므로 여기서는 생략합니다. 표현식 트리를 구축하고 존재하지 않는 속성과 같은 가능한 예외를 처리하려면 System.Linq.Expressions
네임스페이스를 사용해야 합니다.) 이 솔루션은 동적 정렬 아이디어를 제공합니다. 완전한 구현을 위해서는 실제 상황에 따라 더욱 강력한 코드를 작성해야 합니다. c => param
을 직접 사용하는 것은 실수입니다. 이렇게 하면 학생 개체의 속성이 아닌 매개변수 문자열 자체만 정렬되기 때문입니다. 동적으로 속성을 얻고 올바른 식 트리를 작성하려면 리플렉션을 사용해야 합니다.
위 내용은 LINQ에서 OrderBy 속성을 동적으로 지정하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!