将对象列表转换为另一个列表

时间:2012-10-17 00:49:52

标签: c# .net

我有两个模型类:

public class SalesItem
{
   public string ProductName { get; set; }
   public double UnitPrice { get; set; }
   public int Quantity { get; set; }
}

public class ProductItem : INotifyPropertyChanged
{
   public string ProductName { get; set; }
   public double UnitPrice { get; set; } 
}

我有一个SalesItem列表List<ProductItem> products,如何将其转换为List<SalesItem> sales


已编辑

List<ProductItem> salesList = new List<ProductItem>();
List<SalesItem> salesItem = salesList.Cast<SalesItem>();

错误:

Connot implicitly convert type 'System.Collections.Generic.IEnumerable<Model.SalesItem>' to 'System.Collections.Generic.List<Model.SalesItem>'. An explicit conversion exists (are you missing a cast?

4 个答案:

答案 0 :(得分:2)

在您给出的示例中,您无法在这两种类型之间进行转换,因为它们彼此之间没有任何共同之处。正确的做法是拥有一个baseItem类,然后是一个继承自derivedItem的{​​{1}}类。然后你可以这样做:

baseItem

这通常被称为向下转换,并且通常是代码中不正确层次结构的指示器,因此我建议限制其使用。

答案 1 :(得分:2)

尝试并测试

包含命名空间

using System.Linq;

然后

List<ProductItem> yourProductlist = new List<ProductItem>();

yourProductlist.Add(new ProductItem() { ProductName = "A", UnitPrice = 50 });
yourProductlist.Add(new ProductItem() { ProductName = "B", UnitPrice = 150 });

List<SalesItem> yourSaleslist = yourProductlist.Select(x => 
                           new SalesItem() { ProductName = x.ProductName, 
                                             UnitPrice = x.UnitPrice }).ToList();

看到它正常工作

enter image description here

如果ProductItem从SalesItem类继承,则转换将起作用

答案 2 :(得分:1)

您需要将SalesItem更改为继承自ProductItem,然后您可以使用LINQ,如下所示:

List<ProductItem> products;
IEnumerable<SalesItem> salesItems = products.Cast<SalesItem>();

List<SalesItem> salesItems = products.Cast<SalesItem>().ToList();

不要忘记确保文件中包含以下内容,以便Cast扩展方法可用:

using System.Linq;

答案 3 :(得分:1)

您可以在此处定义defaultQuantity的值,因为它ProductItem中不存在。

List<SalesItem> sales = products.ConvertAll(x => new SalesItem() {
                            ProductName = x.ProductName,
                            Quantity = defaultQuantity, 
                            UnitPrice = x.UnitPrice  
                        });