我有一个方法,我传入一个List,然后在方法中进行排序。
类型ChartItemData
包含Average
,ProportionHighScore
和ProportionLowScore
等属性。根据方法的用法,我需要在不同属性的方法内对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();
}
答案 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();
}