2012-02-21 50 views
2

我不知道如果我问这个正确的方式,但这里是我想做的事:合并多态列表到一个列表,并获得派生类型

型号

public abstract class IncomingOrderBase 
{ 
    public string Summary { get; set; } 
} 

public class IncomingProductOrder : IncomingOrderBase 
{ 
    public Product Product { get; set; } 
} 
public class IncomingServiceOrder : IncomingOrderBase 
{ 
    public Service Service { get; set; } 
} 

public class Sale 
{ 
    public ICollection<IncomingProductOrder> ProductOrders { get; set; } 
    public ICollection<IncomingServiceOrder> ServiceOrders { get; set; } 

    public List<IncomingOrderBase> GetAllOrders() 
    { 
     var orders = this.ProductOrders +++PLUS+++ this.ServicesOrders; 
     return orders.ToList(); 
    } 
} 

用法

foreach(var order in sale.GetAllOrders()) 
{ 
    Console.WriteLine(order.GetType().Name); 
    //output = "ProductOrder" or "ServiceOrder" not "IncomingOrderBase" 
} 

如何编译两个(或更多)列出一个列表中,然后得到日原(衍生)型e结果列表?我想我使用Concat()工作,但我真的很感激专家在这方面的例子。

回答

6

是的,Concat是你想要什么:

public List<IncomingOrderBase> GetAllOrders() 
{ 
    return ProductOrders.Concat<IncomingOrderBase>(ServicesOrders).ToList(); 
} 

注意,这只能在.NET 4中,这对IEnumerable<T>通用协工作。如果您使用.NET 3.5,你需要

public List<IncomingOrderBase> GetAllOrders() 
{ 
    return ProductOrders.Cast<IncomingOrderBase>() 
         .Concat(ServicesOrders.Cast<IncomingOrderBase>()) 
         .ToList(); 
} 
+0

我觉得第二个例子是很多清晰。除非有一些性能损失,否则我宁愿将它与.NET 4一起使用。 – zmbq 2012-02-21 21:02:53

1

除了建议的解决方案,你可以考虑这个,这是有点更干净的代码:

var result = new List<IncomingOrderBase>(ProductOrders); 
result.AddRange(ServiceOrders); 
return result;