2016-03-02 17 views
1

我有一個方法,我傳遞一個列表,然後在列表中進行排序。如何傳遞屬性和sortorder作爲排序列表的參數方法

類型ChartItemData包括如AverageProportionHighScoreProportionLowScore的屬性。根據方法的使用情況,我需要在不同屬性的方法內對列表進行排序,以及升序或降序。

如何在參數列表中指定要排序的屬性以及要使用的排序順序?

我想我可以設置SortDirection的Enum,但我仍然需要找出如何傳遞屬性進行排序。這裏有一些僞代碼來說明我在使用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(); 
} 
+0

嘗試使用反射基於字符串傳遞,以獲得正確的屬性:https://msdn.microsoft.com/en- us/library/kz0a8sxy(v = vs.110).aspx –

+0

你可以定義你自己的比較器,看這個鏈接:http://stackoverflow.com/questions/12753762/linq-syntax-for-orderby-with-custom- comparert – Aliz

回答

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); 
     } 
+0

謝謝,這看起來不錯 - 而且我也很高興能夠嘗試並瞭解「方法」簽名,這是我之前沒有用過的簽名。 –

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

非常好,這將工作。我會在一些情況下嘗試。但是,如果我理解正確,在這裏我需要傳遞屬性名稱作爲硬編碼,所以大概如果我更改屬性名稱,我必須然後更新字符串代碼?我假設沒有Object.Property.PropertyNameToString()? –

相關問題