在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中文網其他相關文章!