首页 文章

C#按属性名排序对象数组存在于对象中

提问于
浏览
0

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

使用排序方向“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;
    }

1 回答

  • 1

    您可以通过使方法通用以从调用方法接受类型,然后使用类型参数T将dataSource转换为,来执行您想要的操作 .

    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;使用System.Collections.Generic;使用System.Text;使用System.Collections.Generic;使用System.Linq;使用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;
            }
        }
    }
    

    将它放在一个控制台应用程序项目中,并确保引用包含上述代码的库:using System;使用System.Collections.Generic;使用System.Text;使用GenericMethod;使用System.Linq;

    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 .

相关问题