首頁 >後端開發 >C++ >如何在 LINQ 中動態指定 OrderBy 屬性?

如何在 LINQ 中動態指定 OrderBy 屬性?

Susan Sarandon
Susan Sarandon原創
2025-01-10 12:35:42311瀏覽

How Can I Dynamically Specify the OrderBy Property in LINQ?

動態指定LINQ OrderBy參數

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn