2017-06-19 9 views
1

アプリケーションでは、2つのモデルクラスカテゴリと製品があります。下記の通りです。リストのモデルクラスをC#のリストの別のモデルクラスに追加する他の方法はありますか?

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; 
    } 
} 

最小限のコードで書き込む方法はありますか?誰かがこれに対して別の解決策を提案していただければ幸いです。

+0

は、なぜあなたは、製品にカテゴリIDが必要なのか

は、ここで出力ですか?このグラフをEntity Frameworkに保存しますか? –

+0

これはデータベース接続を処理しません。これはちょうど必要条件です –

+0

はケース3です:Id = 2 a miss type? – uk2k05

答えて

1

オブジェクトの作成を扱うため、大幅に短縮されるものはありません。そのため、これらの新しい呼び出しを作成する必要があります。代わりに、書き込みの後、

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

流暢なのproduを追加するビルダーメソッドを提供できますcts to category(カテゴリの拡張メソッドまたはインスタンスメソッドのいずれかになります)。これらのメソッドは、商品が追加されたカテゴリを返します。そして、使用は、(カテゴリに製品を追加するには、3つの異なるオプションがあります)のようになります。

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); 
} 
0

私は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クラスの:改正Categoryクラスここで

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; } 
} 

です:

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; 
    } 
} 
関連する問題