2011-01-02 15 views
3

カタログ内の各製品のすべての可能な製品オプション/値の組み合わせのリストを生成しようとしています。各製品は、可変数のオプションを持つことができ、各オプションは可変数の値を持つことができます。結果セットを連結する

たとえば、シャツがあり、オプション/値が色(赤、黄、青)、サイズ(s、m、l)、素材(綿、ナイロン、ブレンド)だったとします。私はこのようになりますリストを生成したい:

red, s, cotton 
red, s, nylon 
red, s, blend 
red, m, cotton 
red, m, nylon 
red, m, blend 
red, l, cotton 
red, l, nylon 
red, l, blend 
yellow, s, cotton 
yellow, s, nylon 
yellow, s, blend 
yellow, m, cotton 
yellow, m, nylon 
yellow, m, blend 
yellow, l, cotton 
yellow, l, nylon 
yellow, l, blend 
blue, s, cotton 
blue, s, nylon 
blue, s, blend 
blue, m, cotton 
blue, m, nylon 
blue, m, blend 
blue, l, cotton 
blue, l, nylon 
blue, l, blend 

私は理論的には、これは結果の多くを生成することができることを知っているが、実際には製品のほとんどは、2つのまたは3の値を持つ2つのまたは3つのオプションを持っています各。

私はC#で作業していますが、どのようなコード例も非常に役に立ちます。ご提案ありがとうございました!

+0

これらの回答の中には、使用している.Netのバージョンが重要です。 Tupleを使用するものは4.0、LINQを使用するものは3.5+を必要とします。 –

答えて

3

ボイラープレートのもの:

public class Color 
{ 
    private readonly string _color; 

    public Color(string color) 
    { 
     _color = color; 
    } 

    public override string ToString() 
    { 
     return _color; 
    } 
} 

public class Size 
{ 
    private readonly string _size; 

    public Size(string size) 
    { 
     _size = size; 
    } 

    public override string ToString() 
    { 
     return _size; 
    } 
} 

public class Material 
{ 
    private readonly string _material; 

    public Material(string material) 
    { 
     _material = material; 
    } 

    public override string ToString() 
    { 
     return _material; 
    } 
} 

関連部分:

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var colors = new List<Color>() { new Color("Red"), 
              new Color("Yellow"), 
              new Color("Blue") }; 

      var sizes = new List<Size>() { new Size("S"), 
              new Size("M"), 
              new Size("L") }; 

      var materials = new List<Material>() { new Material("Cotton"), 
                new Material("Nylon"), 
                new Material("Blend") }; 

      var products = from c in colors 
          from s in sizes 
          from m in materials 
          select new { Color = c, Size = s, Material = m }; 


      foreach (var p in products) 
      { 
       Console.WriteLine("{0}, {1}, {2}", p.Color, p.Size, p.Material); 
      } 
      Console.ReadKey(true); 
     } 
    } 
} 
+0

私が探していた正確な解決策ではありませんが、これで十分に理解できました。私が提供したすべての回答から主な違いは、3つのオプションセットで作業しているとは限らないことです.2つのオプションがあり、時には4つまたは5つのオプションがあることもあります。オプションはデータベースから読み込まれ、事前に入力方法を知らなかった。とにかく、ちょっと追加のハッキングで、この答えが私に届いた。どうもありがとう! – Beau

+0

問題ありません。あなたが仕事をしてくれたことを聞いてうれしい。 –

2

それはのような単純なものでした:

colourssizesmaterialsは、値の文字列配列です
public class Product 
{ 
    public string Colour { get; set; } 
    public string Size { get; set; } 
    public string Material { get; set; } 
} 

IList<Product> products = new List<Product>(); 
foreach (string colour in colours) 
{ 
    foreach (string size in sizes) 
    { 
    foreach (string material in materials) 
    { 
     products.Add(new Product 
     { 
     Colour = colour, 
     Size = size, 
     Material = material 
     }); 
    } 
    } 
} 

。これはあなたが期待していたものですか?

0

これは実際には連結ではなくクロス結合です。

LINQまたはネストされたforeachループを使用して、C#でこれを行うことができます。 LINQのやり方はかなり簡単です。色、サイズ、およびファブリックがコレクション内に既にコード内に存在すると仮定します。

from color in colors 
from size in sizes 
from fabric in fabrics 
select new { 
    color, 
    size, 
    fabric 
} 
3
var results = from c in colours 
       from s in sizes 
       from m in materials 
       select Tuple.Create(c, s, m); 

か、最後の行に匿名型を作成することができます。

select new { Colour = c, Size = s, Material = m }; 
+0

+1 for LINQ –

+1

いい答え...しかし、Tuple.Createは.NET4だけです。 –

0

も考慮してください。

public enum Color {Red, Yellow, Blue}; 
public enum Size  {S, M, L}; 
public enum Material {Cotton, Nylon, Blend}; 
public class Product 
{ 
    public Color color; 
    public Size  size; 
    public Material material; 
} 

List<Product> products = new List<Product>(); 

int numColors = Enum.GetValues(typeof(Color)).Length; 
int numSizes  = Enum.GetValues(typeof(Size)).Length; 
int numMaterials = Enum.GetValues(typeof(Material)).Length; 

for(int i = 0; i < numColors; i++) 
    for(int j = 0; k < numSizes; j++) 
     for(int k = 0; k < numMaterials; k++) 
     { 
      Product p = new Product(); 
      p.color = (Color)i; 
      p.size  = (Size)j; 
      p.material = (Material)k; 
      products.Add(p); 
     } 
+1

マジックナンバーを使うのは良い考えではありません。 – Pabuc

+1

これには、forループ内の各列挙割り当てのキャストが必要です。例えば。 p.color =(カラー)i; –

+0

@Pabuc - 急いで、Enumアイテムのカウント方法を正確に覚えていませんでした。ありがとう。 – Eric

関連する問題