【问题标题】:Any other way to add the model class of list into another model class of list in c#?在c#中将list的模型类添加到另一个list的模型类中的任何其他方式?
【发布时间】:2017-11-21 16:27:36
【问题描述】:

在应用程序中,我有两个模型类类别和产品。如下所示

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int CategoryId { get; set; }
}
public class Category
{
    public Category()
    {
        Products = new List<Product>();
    }
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Product> Products { get; set; }
}

我将数据添加到如下类别和产品列表中。

List<Category> data = new List<Category>();
data.Add(new Category { Id = 1, Name = "Plastic"});
data.Add(new Category { Id = 2, Name = "Metal"});
data.Add(new Category { Id = 3, Name = "Paper" });
foreach (var item in data)
{
    switch (item.Id)
    {
        case 1: 
            item.Products.Add(new Product { Id = 1, Name = "Doll", CategoryId = item.Id });
            item.Products.Add(new Product { Id = 2, Name = "Pen", CategoryId = item.Id });
            break;
        case 2: 
            item.Products.Add(new Product { Id = 3, Name = "Nail", CategoryId = item.Id });
            item.Products.Add(new Product { Id = 4, Name = "Key", CategoryId = item.Id });
            break;
        case 3: 
            item.Products.Add(new Product { Id = 5, Name = "Book", CategoryId = item.Id });
            break;
        default: 
            item.Products.Add(new Product { Id = 0, Name = null });
            break;
    }
}

还有其他方法可以用最少的代码来编写吗?如果有人为此提出其他解决方案,我将不胜感激。

【问题讨论】:

  • 为什么在产品中需要类别 ID?您是否将此图存储在 Entity Framework 中?
  • 这不是处理任何数据库连接。这只是一个要求
  • 是案例 3:Id = 2 未命中类型吗?
  • 抱歉,已更正
  • 好的,刚刚注意到在案例 1 中:您的 Id = 1 或 2,因此仅使用 Id = item.Id 可能行不通

标签: c# .net list linq collections


【解决方案1】:

没有什么会显着缩短,因为它处理对象创建,所以无论如何您都必须进行这些新调用。你可以做类似的事情......

在你的 Product 类上创建一个名为 Create 的静态方法:

public static Product Create(int id, string name, Category cat)
{
    return new Product { Id = id, Name = name, cat.Id };
}

那么不要写:

item.Products.Add(new Product { Id = 1, Name = "Doll", CategoryId = item.Id });

写:

item.Products.Add(Product.Create(1, "Doll", item);

【讨论】:

    【解决方案2】:

    您可以提供 fluent 构建器方法来将产品添加到类别(可以是扩展方法或类别的实例方法)。这些方法应返回添加产品的类别。使用情况如下(将产品添加到类别有三种不同的选项):

    var data = new List<Category> {       
       new Category { Id = 1, Name = "Plastic" } 
          .WithProducts(  
              new Product { Id = 1, Name = "Doll" }
              new Product { Id = 2, Name = "Pen" }
          ),
    
       new Category { Id = 3, Name = "Paper" }
          .WithProduct( new Product { Id = 2, Name = "Book" } ),
    
       new Category { Id = 2, Name = "Plastic" }
          .WithProduct(3, "Nail")
          .WithProduct(4, "Key"),
    };
    

    以及流畅的扩展方法(你可以全部使用,或者选择你更喜欢的语法):

    public static Category WithProduct(this Category category, int id, string product)
    {
        category.Products.Add(new Product { Id = id, Name = name, CategoryId = category.Id });
        return category;
    }
    
    public static Category WithProduct(this Category category, Product product)
    {
        product.CategoryId = category.Id;
        category.Products.Add(product);
        return category;
    }
    
    public static Category WithProducts(this Category category, params Product[] products)
    {
        foreach(var product in products)
        {
            product.CategoryId = category.Id;
            category.Products.Add(product);
        };
    
        return category;
    }
    

    请注意,当您将产品添加到类别时,将自动设置类别 ID。


    进一步说明:您的设计存在一个问题 - 当您公开类别 Products 和类别 ID 进行修改时,可能有人可以将另一个类别的产品添加到产品列表中:

    var plastic = new Category { Id = 1, Name = "Plastic"};
    plastic.Products.Add(new Product {Id = 1, Name = "Doll", CategoryId = 1});
    plastic.Products.Add(new Product {Id = 5, Name = "Nail", CategoryId = 2}); // plastic nail
    

    我至少会考虑禁用对类别产品的直接修改并将产品的设置类别 ID 移到那里:

    private List<Product> products = new List<Product>();
    public IEnumerable<Product> Products => products;
    
    public void AddProduct(Product product)
    {
        // probably check if product was not added to some other category
        product.CategoryId = Id;
        products.Add(product);
    }
    

    【讨论】:

      【解决方案3】:

      我会做一些类似于 Sergey Berezovskiy 建议的事情,但我也会为这两个类添加构造函数。扩展方法很好,但您也可以为 Category 类创建一个公共方法。

      这是输出:

      var categories = new List<Category>
      {
          new Category(1, "Plastic").WithProduct(1, "Doll").WithProduct(2, "Pen"),
          new Category(2, "Metal").WithProduct(3, "Nail").WithProduct(4, "Key"),
          new Category(3, "Paper").WithProduct(5, "Book")
      };
      

      这是修改后的Product 类:

      public class Product
      {
          public Product(int id, string name, int categoryId)
          {
              Id = id;
              Name = name;
              CategoryId = categoryId;
          }
      
          public int Id { get; set; }
          public string Name { get; set; }
          public int CategoryId { get; set; }
      }
      

      这是修改后的Category 类:

      public class Category
      {
          public Category(int id, string name)
          {
              Id = id;
              Name = name;
              Products = new List<Product>();
          }
      
          public int Id { get; set; }
          public string Name { get; set; }
          public List<Product> Products { get; set; }
      
          public Category WithProduct(int id, string name)
          {
              Products.Add(new Product(id, name, Id));
              return this;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        相关资源
        最近更新 更多