2017-07-19 59 views
-1

我有一個對象的集合,按對象的字段值進行排序。目前的問題是訂單取決於業務邏輯。LINQ委託代序

public enum Order : byte { 
    a = 1, 
    b = 2, 
    c = 3 
} 

public class Foo{ 
    public long A {get;set;} 
    public long B {get;set;} 
    public long C {get;set;} 
} 

public class Worker(){ 
    private Foo[] orderFoos(Foo[] foos, Func<Order, long> sort){ 
     return foos.OrderByDescending(f => sort(f)).ToArray(foos.Length); 
    } 

    public void Work(){ 
     Foo[] foos = getFoos(); 

     var orderByA = orderFoos(foos, f => f.A); 
     var orderByB = orderFoos(foos, f => f.B); 
     var orderByC = orderFoos(foos, f => f.C); 
    } 
} 

編譯器會報錯Argument 1: cannot convert from 'Foo' to 'Order'。是否有任何解決方法或解決方案?

+0

不'Foo.A','Foo.B'和'Foo.C'持有什麼樣的價值觀? – NtFreX

+0

@NFFRX'''long''',它在Foo類聲明中提及。 – Max

+0

我知道什麼值,而不是什麼類型。我問,因爲我不明白你想做什麼。 – NtFreX

回答

0

下面的代碼似乎工作。這是對orderFoos方法的一個小改動,用一些示例代碼來測試結果。

using System; 
using System.Linq; 

public enum Order : byte 
{ 
    a = 1, 
    b = 2, 
    c = 3 
} 

public class Foo 
{ 
    public long A { get; set; } 
    public long B { get; set; } 
    public long C { get; set; } 
} 

public class Worker 
{ 
    private Foo[] orderFoos(Foo[] foos, Func<Foo, long> sort) 
    { 
     return foos.OrderByDescending(sort).ToArray(); 
    } 

    public void Work() 
    { 
     Foo[] foos = { new Foo() { A = 1, B = 2, C = 3 }, new Foo() { A = 10, B = 1, C = 2 }, new Foo() { A = -1, B = 1, C = 10 } }; 

     var orderByA = orderFoos(foos, f => f.A); 
     var orderByB = orderFoos(foos, f => f.B); 
     var orderByC = orderFoos(foos, f => f.C); 

     Console.WriteLine(orderByA.First().A); // I expect the second to be first here so 10 
     Console.WriteLine(orderByB.First().A); // I expect the first to be first here so 1 
     Console.WriteLine(orderByC.First().A); // I expect the third to be first here so -1 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var worker = new Worker(); 

     worker.Work(); 
     Console.ReadLine(); 
    } 
} 
+0

那麼,我會用'''Order'''參數來做什麼。 – Max

1

看來你想實現的是在不同的領域進行排序。您可能不需要有秩序枚舉如果它只是用於這一目的並替換:

private Foo[] orderFoos(Foo[] foos, Func<Order, long> sort){ 
    return foos.OrderByDescending(f => sort(f)).ToArray(foos.Length); 
} 

private Foo[] orderFoos(Foo[] foos, Func<Foo, long> sort){ 
    return foos.OrderByDescending(sort).ToArray(foos.Length); 
} 

注:我不知道你的意圖與在ToArray的方法添加foos.Length ,但據說這超出了問題的範圍。

+0

您的解決方案無法按預期工作,但它讓我更好地瞭解代表的工作方式。 – Max

0

@ hsoesanto給出了一個很好的解決方案,但它並不按照我預期的方式工作。
所以我創建了臨時解決方法。

private Func<Foo, long> GetOrderFunction(Order orderType) 
{ 
    switch (orderType) 
    { 
     case Order.A: 
      return (f) => f.A; 
     case Order.B: 
      return (f) => f.B; 
     case Order.C: 
      return (f) => f.C; 
    } 
} 

private Foo[] orderFoos(Foo[] foos, Order order) 
{ 
    var orderFunction = GetOrderFunction(order); 
    return foos 
     .OrderByDescending(f => orderFunction (f)) 
     .ToArray(foos.Length); 
}