C# 根据传入字段,多条件动态排序
动态排序扩展:

public static IOrderedQueryable<T> OrderByMultipleFields<T>(this IQueryable<T> source, string[] orderByProperties, bool[] ascending) { if (orderByProperties == null || orderByProperties.Length == 0) throw new ArgumentException("No order by properties specified.", nameof(orderByProperties)); if (ascending == null || ascending.Length != orderByProperties.Length) throw new ArgumentException("The ascending array must have the same length as the orderByProperties array.", nameof(ascending)); IOrderedQueryable<T> orderedQuery = (IOrderedQueryable<T>)source; for (int i = 0; i < orderByProperties.Length; i++) { string propertyName = orderByProperties[i]; bool asc = ascending[i]; ParameterExpression parameter = Expression.Parameter(typeof(T), "x"); MemberExpression member = Expression.PropertyOrField(parameter, propertyName); LambdaExpression orderLambda = Expression.Lambda(member, parameter); string methodName = asc ? i == 0 ? "OrderBy" : "ThenBy" : i == 0 ? "OrderByDescending" : "ThenByDescending"; Type elementType = typeof(T); Type keyType = member.Type; MethodInfo genericMethod = typeof(Queryable).GetMethods().First( method => method.Name == methodName && method.IsGenericMethodDefinition && method.GetParameters().Length == 2); MethodInfo constructedMethod = genericMethod.MakeGenericMethod(elementType, keyType); orderedQuery = (IOrderedQueryable<T>)constructedMethod.Invoke(null, new object[] { orderedQuery, orderLambda }); } return orderedQuery; }
使用动态排序:

var people = new List<Person> { new() { Name = "Charlie", Age = 25, City = "Los Angeles" }, new() { Name = "Alice", Age = 25, City = "New York" }, new() { Name = "David", Age = 35, City = "Chicago" }, new() { Name = "Bob", Age = 30, City = "New York" }, new() { Name = "Eve", Age = 25, City = "New York" } }; // 使用LINQ查询来应用动态排序 var orderByFields = new[] { "Name", "Age" }; // 要排序的字段名数组 var ascending = new[] { true, false }; // 每个字段的排序方向(升序/降序)数组 //多条件排序 var sortedPeople = people.AsQueryable() .OrderByMultipleFields(orderByFields, ascending) .ToList();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)