如何将属性和排序顺序作为方法中排序列表的参数传递

本文关键字:排序 方法 列表 参数传递 顺序 属性 | 更新日期: 2023-09-27 18:37:02

>我有一个方法,我传入一个列表,然后在方法中对其进行排序。

类型 ChartItemData 包括 AverageProportionHighScoreProportionLowScore 等属性。根据方法用法,我需要根据不同的属性(升序或降序)对方法内的 List 进行排序。

如何在方法的参数列表中指定要排序的属性以及要使用的排序顺序?

我想我可以为 SortDirection 设置一个枚举,但我仍然需要找出如何传入属性进行排序。这里有一些伪代码来说明我所追求的,使用List.OrderBy。我还可以使用 List.Sort 方法对列表进行排序,如果这更有意义的话。

public enum SortDirection { Ascending, Descending }
public void myMethod(List<ChartItemData> myList, "parameter propertyToSortOn", 
    SortDirection direction)
{
     if (direction == SortDirection.Ascending)
        var sorted = ChartData.OrderBy(x => x."propertyToSortOn").ToList();
     else
        var sorted = ChartData.OrderByDescending(x => x."propertyToSortOn").ToList();
}

如何将属性和排序顺序作为方法中排序列表的参数传递

这样

的东西会起作用吗?它允许您引用要通过第二个方法参数(lambda)进行排序的属性。否则你几乎会陷入反思。

public class ChartItemData
    {
        public double Average { get; set; }
        public double HighScore { get; set; }
        public double LowScore { get; set; }
        public string Name { get; set; }
    }
    class Program
    {
        public enum SortDirection { Ascending, Descending }
        public void myMethod<T>(List<ChartItemData> myList, Func<ChartItemData, T> selector, SortDirection direction)
        {
            List<ChartItemData> sorted = null;
            if (direction == SortDirection.Ascending)
            {
                sorted = myList.OrderBy(selector).ToList();
            }
            else
            {
                sorted = myList.OrderByDescending(selector).ToList();
            }
            myList.Clear();
            myList.AddRange(sorted);
        }
        public void usage()
        {
            List<ChartItemData> items = new List<ChartItemData>();
            myMethod(items, x => x.Average, SortDirection.Ascending);
            myMethod(items, x => x.Name, SortDirection.Ascending);
        }
我会

说最简单的方法是使用反射从提供的名称中获取PropertyInfo。

然后,可以使用该 PropertyInfo 从列表中的每个值中获取值,以按以下方式对列表进行排序:

public List<ChartItemData> myMethod(List<ChartItemData> myList, string propName, SortDirection direction)
{
    var desiredProperty = typeof(ChartItemData).GetProperty(propName, BindingFlags.Public | BindingFlags.Instance);
    if (direction == SortDirection.Ascending)
        return myList.OrderBy(x => desiredProperty.GetValue(x)).ToList();
    else
        return myList.OrderByDescending(x => desiredProperty.GetValue(x)).ToList();
}