c#根据对象中存在的属性名对对象数组进行排序

本文关键字:对象 数组 排序 存在 属性 | 更新日期: 2023-09-27 18:06:18

以下代码按对象中存在的任何属性名(如字符串)对任何对象数组进行排序。

排序数组也使用排序方向"asc"或"desc"。

这是我想要实现的目标。

    using System.Linq.Dynamic;
    /// <summary>
    /// This method sorts any array of objects.
    /// </summary>
    /// <param name="dataSource">Array of objects</param>
    /// <param name="propertyName">property name to sort with</param>
    /// <param name="sortDirection">"ASC" or "DESC"</param>
    /// <returns></returns>
    private object[] SortArrayOfObjects(object[] dataSource, string propertyName, string sortDirection)
    {
        string sortExpression = string.Format("{0} {1}", propertyName, sortDirection);
        // sortExpression will be something like "FirstName DESC".
        // OrderBy method takes expression as string like "FirstName DESC".
        // OrderBy method exists in "System.Linq.Dynamic" dll.
        // Download it from www.nuget.org/packages/System.Linq.Dynamic/
        object[] arrSortedObjects = dataSource.OrderBy(sortExpression).ToArray();
        return arrSortedObjects;
    }

c#根据对象中存在的属性名对对象数组进行排序

您可以通过使方法泛型以接受来自调用方法的类型,然后使用类型参数T将数据源强制转换为。

private object[] SortArrayOfObjects<T>(object[] dataSource, string propertyName, string sortDirection)
    {
        string sortExpression = string.Format("{0} {1}", propertyName, sortDirection);
        // sortExpression will be something like "FirstName DESC".
        // OrderBy method takes expression as string like "FirstName DESC".
        // OrderBy method exists in "System.Linq.Dynamic" dll.
        // Download it from www.nuget.org/packages/System.Linq.Dynamic/
        object[] arrSortedObjects = dataSource.Cast<T>().OrderBy(sortExpression).Cast<object>().ToArray();
        return arrSortedObjects;
    }
}
// Use it like:       | You pass the type, so no need for hardcoding it, and it should work for all types.
SortArrayOfObjects<EmployeeInfo>(object[] dataSource, string propertyName, string sortDirection);

下面是一个完整的演示:

将其放入DLL输出项目中:使用系统;使用System.Collections.Generic;使用text;使用System.Collections.Generic;使用来;使用System.Linq.Dynamic;

namespace GenericMethod
{
    public class GenericMethodClass
    {
        public T[] SortArrayOfObjects<T>(object[] dataSource, string propertyName, string sortDirection)
        {
            string sortExpression = string.Format("{0} {1}", propertyName, sortDirection);
            // sortExpression will be something like "FirstName DESC".
            // OrderBy method takes expression as string like "FirstName DESC".
            // OrderBy method exists in "System.Linq.Dynamic" dll.
            // Download it from www.nuget.org/packages/System.Linq.Dynamic/
            T[] arrSortedObjects = dataSource.Cast<T>().OrderBy(sortExpression).ToArray();
            return arrSortedObjects;
        }
    }
}

将其放入控制台应用程序项目中,并确保引用包含上述代码的库:使用系统;使用System.Collections.Generic;使用text;使用GenericMethod;使用来;

namespace GenericMethodApp
{
    public class Program
    {
        static void Main(string[] args)
        {
            var employees = new object[]
            {
                new EmployeeInfo { FirstName = "Mohammed" },
                new EmployeeInfo { FirstName = "Ghasan" }
            };
            var students = new object[]
            {
                new Student { StudentName = "Mike" },
                new Student { StudentName = "Harris" }
            };
            var genericMethodClass = new GenericMethodClass();
            // Note that the generic method returns the array of the specific type
            // thanks to the T type parameter.
            EmployeeInfo[] returnedEmployees = genericMethodClass.SortArrayOfObjects<EmployeeInfo>(employees, "FirstName", "ASC");
            Student[] returnedStudents = genericMethodClass.SortArrayOfObjects<Student>(students, "StudentName", "ASC");
            foreach (var employee in returnedEmployees)
                Console.WriteLine(employee.FirstName);
            Console.WriteLine();
            foreach (var Student in returnedStudents)
                Console.WriteLine(Student.StudentName);
            Console.ReadKey();
        }
    }
    public class EmployeeInfo
    {
        public string FirstName { get; set; }
    }
    public class Student
    {
        public string StudentName { get; set; }
    }
}

你完成了。

确保在DLL中引用System.Linq.Dynamic。