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

时间:2016-03-02 20:41:33

标签: c# sorting

我有一个方法,我传入一个List,然后在方法中进行排序。

类型ChartItemData包含AverageProportionHighScoreProportionLowScore等属性。根据方法的用法,我需要在不同属性的方法内对List进行排序,以及Ascending或Descending。

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

我想我可以为SortDirection设置一个枚举,但我仍然需要找出如何传入属性进行排序。下面是一些伪代码,用于说明我使用List.OrderBy后的内容。我还可以使用List.Sort方法对List进行排序,如果这更有意义的话。

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();
}

2 个答案:

答案 0 :(得分:2)

这样的事情会起作用吗?它允许您引用属性以通过第二个方法参数(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);
        }

答案 1 :(得分:1)

我说最简单的方法是use reflection to get the PropertyInfo from the name provided

然后,您可以use that PropertyInfo to get the value from each value within the list按以下方式对列表进行排序:

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();
}