2017-07-19 48 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); 
}