C# linq查询之动态OrderBy用法实例

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技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • C# winform点击生成二维码实例代码

    下面我将详细讲解“C# winform点击生成二维码实例代码”的完整攻略。 需要用到的工具和库 Visual Studio: 一个面向 Windows 系统的开发工具,方便我们进行 C# winform 的开发。 ZXing:是一个开源的 QR 和条形码扫描、创建库,提供多种语言的实现支持。 代码实现 步骤一:安装ZXing库 首先,我们需要下载安装 ZXi…

    C# 2023年6月7日
    00
  • C# wpf解决Popup弹出位置异常问题解决

    在WPF中,我们可以通过Popup弹出一个窗口,但是由于窗口的弹出位置可能会和我们期望的不一样,而且有时候在某些屏幕分辨率下表现得更为明显。在这种情况下,我们需要进行调整以确保Popup窗口出现在我们期望的位置。下面是解决这个问题的方法: 1. 设置PlacementMode属性 在Popup控件中,可以通过设置PlacementMode属性来控制Popup…

    C# 2023年6月6日
    00
  • Windows10 1903错误0xc0000135解决方案【推荐】

    Windows101903错误0xc0000135解决方案【推荐】 Windows101903错误0xc0000135通常是由于缺少或损坏了.NET Framework或其他必要的系统组件而引起的。本文将提供详细的“Windows101903错误0xc0000135解决方案”的完整攻略,包括如何检查和修复系统组件,以及两个示例。 检查和修复系统组件 在解决W…

    C# 2023年5月15日
    00
  • 详解C#用new和override来实现抽象类的重写区别

    下面我将详细讲解“详解C#用new和override来实现抽象类的重写区别”的完整攻略。 什么是抽象类 抽象类是一个不能被实例化的类,通常被用来定义和封装一些通用的属性或方法,子类必须继承并实现这些抽象类中定义的方法。 在C#中,抽象类使用abstract关键字来进行定义,定义格式为: public abstract class MyClass { //类成…

    C# 2023年5月15日
    00
  • C#面向对象编程中依赖反转原则的示例详解

    C#面向对象编程中依赖反转原则的示例详解 什么是依赖反转原则 依赖反转原则(DIP)是面向对象设计的重要原则之一。它的核心是:高层模块不应该依赖低层模块,而是共同依赖于抽象层。换句话说,具体的实现应该依赖于抽象定义。 通过这个原则,我们可以实现两个重要目标: 可替换性:由于高层模块和低层模块都依赖于抽象层,因此可以在满足接口规范的前提下,随时替换实现类。 解…

    C# 2023年6月1日
    00
  • C#中实现伪静态页面两种方式介绍

    C#中实现伪静态页面两种方式介绍 什么是伪静态页面? 在 Web 应用程序中,URL 路径通常采用传统的参数传递方式,如 /index.aspx?id=123。伪静态页面则使用类似于静态页面的 URL 地址而不是传统的动态链接地址(如 PHP 中的 /index.php?id=123)。伪静态页面看起来像是真正的静态页面,但实际上仍然是由动态脚本生成的页面。…

    C# 2023年6月7日
    00
  • Java里的static import使用小结

    Java里的static import使用小结 在Java中,我们可以使用static import语句来导入静态成员,以便在代码中直接使用它们,而无需使用类名或接口名。本文将提供详细的“Java里的static import使用小结”的完整攻略,包括如何使用static import语句,以及两个示例。 使用static import语句 使用static…

    C# 2023年5月15日
    00
  • CommunityToolkit.Mvvm系列文章导航

    包 CommunityToolkit.Mvvm (又名 MVVM 工具包,以前名为 Microsoft.Toolkit.Mvvm) 是一个现代、快速且模块化的 MVVM 库。 它是 .NET 社区工具包的一部分,围绕以下原则构建: 平台和运行时独立 – .NET Standard 2.0、 .NET Standard 2.1 和 .NET 6? (UI Fr…

    C# 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部