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 中国語 Web サイトの他の関連記事を参照してください。