2012-02-21 40 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;