C# LINQ是一种处理数据的标准方式,而OrderBy方法则是集合操作中的一种常见方式,用于排序实例。在使用LINQ的时候,OrderBy方法除了提供常规的静态排序,还可以通过动态排序来满足更灵活的需求。
动态OrderBy方法概述
动态OrderBy方法可以接受一个字符串参数,以便动态指定排序依据。在字符串中传递排序依据属性名称,并指定排序的方式(升序或降序),OrderBy方法就可以通过反射对集合进行动态排序。
下面是一个示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
namespace Demo
{
class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main(string[] args)
{
var students = new List<Student>
{
new Student { Id = 1, Name = "张三", Age = 18 },
new Student { Id = 3, Name = "李四", Age = 20 },
new Student { Id = 5, Name = "王五", Age = 16 }
};
Console.WriteLine("请输入排序依据:");
var key = Console.ReadLine();
Console.WriteLine("请输入排序方式(1:升序,-1:降序):");
var order = Console.ReadLine();
var expression = Expression.Parameter(typeof(Student), "x");
var property = Expression.Property(expression, key);
var lambda = Expression.Lambda<Func<Student, int>>(property, expression);
var method = order == "1" ? "OrderBy" : "OrderByDescending";
var result = (typeof(Enumerable).GetMethods().FirstOrDefault(m => m.Name == method && m.GetParameters().Length == 2).MakeGenericMethod(typeof(Student), property.Type))
.Invoke(null, new object[] { students, lambda });
Console.WriteLine(string.Join(",", ((IEnumerable<Student>)result).Select(e => e.Name)));
Console.ReadKey();
}
}
}
在上述示例代码中,我们通过Console.ReadLine()方法获取用户输入的排序依据和方式,然后使用OrderBy方法进行动态排序。其中,键入的排序依据属性名称通过反射的方式封装成lambda表达式,以便OrderBy方法动态排序。
动态OrderBy方法示例二
下面是更具体的一个示例,包括了对根据多个属性字段来进行动态排序的演示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
namespace Demo
{
class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public double Score { get; set; }
}
class Program
{
static void Main(string[] args)
{
var students = new List<Student>
{
new Student { Id = 1, Name = "张三", Age = 18, Score = 85.5 },
new Student { Id = 3, Name = "李四", Age = 20, Score = 90 },
new Student { Id = 5, Name = "王五", Age = 16, Score = 80 },
new Student { Id = 2, Name = "张三", Age = 16, Score = 70 },
new Student { Id = 4, Name = "李四", Age = 17, Score = 95.5 },
new Student { Id = 6, Name = "王五", Age = 19, Score = 82 }
};
Console.WriteLine("请输入排序依据:");
var keys = Console.ReadLine().Split(',');
var orders = new List<KeyValuePair<string, int>>();
for (int i = 0; i < keys.Length; i++)
{
Console.WriteLine($"请输入第{i+1}个排序依据方式(1:升序,-1:降序):");
orders.Add(new KeyValuePair<string, int>(keys[i], int.Parse(Console.ReadLine())));
}
// 多属性动态排序
IOrderedEnumerable<Student> result = students.OrderBy(x => 0);
for (int i = 0; i < orders.Count; i++)
{
var expression = Expression.Parameter(typeof(Student), "x");
var property = Expression.Property(expression, orders[i].Key);
var lambda = Expression.Lambda<Func<Student, object>>(Expression.Convert(property, typeof(object)), expression);
result = orders[i].Value == 1 ? result.ThenBy(lambda) : result.ThenByDescending(lambda);
}
Console.WriteLine(string.Join(",", result.Select(e => e.Name)));
Console.ReadKey();
}
}
}
在上述代码中,我们演示了如何根据多个属性字段来进行动态排序。用户通过Console.ReadLine()方法输入多个排序依据,以逗号分隔,然后再输入对应的排序方式(升序或降序)。
对于多个排序依据,我们使用方法链的方式,依次调用ThenBy和ThenByDescending方法,在动态传递的条件中使用lambda表达式来实现多次排序。
以上就是“C# linq查询之动态OrderBy用法实例”的完整攻略,希望对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# linq查询之动态OrderBy用法实例 - Python技术站