2014-03-27 117 views
0

我有一個基類的列表。每個派生類都有其獨特的需求,用於對基類中的公共列表進行排序。爲此,我想在基類中創建一個獲取字符串的方法。該字符串包含一個自定義的"OrderBy"查詢。C#語法從字符串

相反的:

protected void SortBaseClassList(string orderByQueryString) 
{ 
    List<MyBaseClass> sortedList = BaseClassList.OrderByDescending(x => x.GetTop) 
               .ThenBy(x => x.GetLeft) 
               .ToList<MyBaseClass>(); 
} 

我想用:

protected void SortBaseClassList(string orderByQueryString) 
    { 
     List<MyBaseClass> sortedList = 
      BaseClassList. + orderByQueryString + .ToList<MyBaseClass>(); 
    } 

這可能嗎?如果是這樣,我該怎麼做?

+0

哪裏查詢字符串從何而來?當你說它是* custom *時,你的意思是*自定義*如輸入/用戶可配置,或*自定義*,如靜態取決於正在排序的類? –

+1

難道你不能只使用鍵字典作爲queryString和價值作爲lambda爲了排序,然後在你的方法find元素與該鍵並使用lambda? – kosnkov

+0

@ O.R.Mapper Custom是派生類的唯一定製orderBy查詢。 – user3165438

回答

1

您似乎需要MyBaseClass的每個子類的一組特定的排序規則。這正是類層次結構中的多態性所在,您可以通過執行IComparable<T> interface來使用它。

添加一個抽象實現你的基類:

public abstract class MyBaseClass : IComparable<MyBaseClass> 
{ 
    // ... 

    public abstract int CompareTo(MyBaseClass other); 
} 

然後,在每個子類中,以應用特定的子類排序以適當的方式覆蓋CompareTo。下面是一個典型的子類:

public class MySubClass : MyBaseClass 
{ 
    // ... 

    public int SomeValue { get; set; } 

    public override int CompareTo(MyBaseClass other) 
    { 
     if (other == null) { 
      // every instance comes after null, cf. docs 
      return 1; 
     } 

     var typedOther = other as MyBaseClass; 
     if (typedOther != null) { 
      // other instance of same type; compare by custom sorting criteria 
      return this.SomeValue.CompareTo(typedOther.SomeValue); 
     } else { 
      // other instance of different type; make sure different types are always sorted in the same order 
      return GetType().FullName.CompareTo(other.GetType().FullName); 
     } 
    } 
} 

這樣做的副作用是,你不需要LINQ OrderBy方法了;您現在可以直接調用就行了Sort(不指定任何額外的,如比較器)和排序就地而不是創建一個新的列表:

BaseClassList.Sort();