2012-11-08 33 views
1

我是相當新的通用編程,並有一個問題:通過特定屬性的通用訂購方法

我想按特定的屬性,應該定義爲參數排序列表。 請看代碼爲更好地瞭解我想要什麼:

public static IEnumerable<T> SortEmployeesFor<T>(
    IEnumerable<T> list, 
    property1, 
    property2, 
    OrderOptions options) 
{ 
    switch (options) 
    { 
     case OrderOptions.1: 
      return list.OrderBy(x => property1).ThenBy(x => property2); 

     case OrderOptions.2: 
      return list.OrderBy(x => property2).ThenBy(x => x.property1); 

     ... 
    } 

    return list; 
} 

是否有執行此的任何選項?


P.S.這是我的第一篇文章,如果我做錯了,請理解並讓我知道。

+0

什麼property1和property2的類型? – Heisenbug

回答

0

當你看到它在MSDN你注意到OrderBy,並ThenBy採取Func<TSource, TKey>作爲關鍵選擇參數調用它。

所以你可以寫一些這樣的通用擴展。

public static IEnumerable<T> SortWithOptions<T, TKey1, TKey2>(
    this IEnumerable<T> source, 
    Func<T, TKey1> selector1, 
    Func<T, TKey2> selector2, 
    OrderOptions options) 
{ 
    switch (options) 
    { 
     case OrderOptions.One: 
      return source.OrderBy(selector1).ThenBy(selector2); 

     case OrderOptions.Two: 
      return source.OrderBy(selector2).ThenBy(selector1); 
    } 
} 

然後,如果你想爲你可以寫一個員工非通用實現,

public static IEnumerable<Employee> SortEmployees(
    IEnumerable<Employee> unsorted, 
    OrderOptions options) 
{ 
    return unsorted.SortWithOptions(
     e => e.Cost, 
     e => e.Ability, 
     options); 
} 
+0

這看起來不錯。我認爲這正是我想要的。非常感謝你。它有助於很多 – xandi1987

+0

@xandi1987,感激地收到任何投票或接受。 – Jodrell

0

試試這個,

list.OrderBy("SomeProperty DESC, SomeOtherProperty ASC"); 

list.OrderBy("SomeProperty"); 
list.OrderBy("SomeProperty DESC"); 
list.OrderBy("SomeProperty DESC, SomeOtherProperty"); 
list.OrderBy("SomeSubObject.SomeProperty ASC, SomeOtherProperty DESC"); 

Here

+0

使用文字是不好的做法 – JConstantine

+0

非常感謝我會看看這個 – xandi1987

0

你可以使用LINQ做到這一點。

public static IEnumerable<T> SortEmployeesFor<T>(IEnumerable<T> list, OrderOptions options) 
{ 
    switch (options) 
    { 
     case OrderOptions.1: 
      list = from t in list 
        orderby t.property1, t.property2 
        select t; 
     case OrderOptions.2: 
      list = from t in list 
        orderby t.property2, t.property1 
        select t;   
     . 
     . 
     . 
    } 
    return list; 
} 
+0

請告訴我你的答案和實際文章??之間的區別。兩者都是相同的.. xandi1987使用lamba表達式進行排序..這是很好的。我認爲你的文章沒有幫助。 –

+0

而不是使用.OrderBy和ThenBy,它將它們放在Linq查詢中。我寧願用這個實現的用戶IQueryable,但希望遵循原始的帖子aproach。 –

3

嘗試在某種性質的傳遞從funcs中T.

所以提取關鍵:

public static IEnumerable<T> SortEmployeesFor<T>(
    IEnumerable<T> list, 
    Func<T, TProp1> order1, 
    Func<T, TProp2> order2, 
    OrderOptions options) 
{ 
    switch (options) 
    { 
    case OrderOptions.1: 
     return list.OrderBy(order1).ThenBy(order2); 

    case OrderOptions.2: 
     return list.OrderBy(order2).ThenBy(order1); 

    ... 
    } 

    return list; 
} 

用法:

SortEmployeesFor<MyType>(
    list, 
    new Func<MyType, typeOfProp1>(x => x.property1), 
    new Func<MyType, typeOfProp2>(x => x.property2), 
    OrderOptions.1); 

不知道這是否是在句法上是正確的,但它應該指向正確的方向。

1
public static IEnumerable<T> SortEmployeesFor<T>(IEnumerable<T> list, Func<T, IComparable> property1, Func<T, IComparable> property2, OrderOption option) 
{ 
    switch (options) 
    { 
    case OrderOptions.1: 
     return list.OrderBy(property1).ThenBy(property2); 

    case OrderOptions.2: 
     return list.OrderBy(property2).ThenBy(property1); 
    } 

    return list; 
} 

然後,使用這樣的事情

list = SortEmployeesFor(list, x => x.Id, y => y.Name, OrderOptions.1);

+1

這與@ Davio的答案類似,但您不需要明確指定要訂購的財產的類型 – JConstantine

+0

也許有點更多背景:我有不同的「系統」具有不同的視圖 - 「僱員」和我的對象想要提供一種通用的排序方法。這種方法應該重載與排序相關的屬性名稱。我想過反思,但我認爲/希望會有更好的解決方案 – xandi1987

相關問題