如何将属性和排序顺序作为方法中排序列表的参数传递
本文关键字:排序 方法 列表 参数传递 顺序 属性 | 更新日期: 2023-09-27 18:37:02
>我有一个方法,我传入一个列表,然后在方法中对其进行排序。
类型 ChartItemData
包括 Average
、ProportionHighScore
和 ProportionLowScore
等属性。根据方法用法,我需要根据不同的属性(升序或降序)对方法内的 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();
}