2

組み合わせについて質問です。

私は実際に e コマース サイトを開発しており、顧客が製品のバリアントを作成できるようにする機能を持っています。

例: ブラック パンツ 34W 30L、ブラック パンツ 38W 32L、ホワイト パンツ 34W 30L。これらは製品バリアントとして定義されます。

私のパンツには 3 つのオプションがあり、それらは色、ウエスト サイズ、長さであると仮定します。

私は今3つのリストを持っています。

ListA = {"black", "white", "red"} //For the color
ListB = {30,32,34,36,38} //For the waist
ListC ={28,30,32,34} //For the length

私の質問は、考えられるすべての組み合わせをどのようにリストできますか?

私の望ましい結果は {{black,30,28},{black,30,30},{black,30,32},{white,34 ,30}} のようになります

PS 難しいのは、顧客がこの製品にいくつのオプションを割り当てるかわからないことです。オプションの数は 1 だけかもしれませんが、これが最も簡単です。3つ以上になるかも…

問題が解決しました

選択肢がいくつあるかわからないからです。したがって、使用する for ループの数はわかりません。つまり、典型的なデカルト積になります。

詳細については、これら 2 つのリンクから読むことができます。 http://www.interact-sw.co.uk/iangblog/2010/07/28/linq-cartesian-1 http://blogs.msdn.com/b/ericlippert/archive/2010/06/28/computing -デカルト積-with-linq.aspx

ご協力ありがとうございました!

4

1 に答える 1

7

コメントで述べたように、Eric Lippert にはComputing a Cartesian Product with LINQという名前のブログ投稿があり、問題の解決方法を説明しています。デカルト積を計算するには拡張メソッドが必要です。

public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences) {
  IEnumerable<IEnumerable<T>> result = new [] { Enumerable.Empty<T>() };
  foreach (var sequence in sequences) {
    var localSequence = sequence;
    result = result.SelectMany(
      _ => localSequence,
      (seq, item) => seq.Concat(new[] { item })
    );
  }
  return result;
}

次に、製品を実行するためのシーケンスのシーケンスが必要です。あなたの場合、シーケンスに文字列と整数の両方があるため、共通の基本型TObject.

var sequences = new[] {
  new Object[] { "black", "white", "red" },
  new Object[] { 30, 32, 34, 36, 38 },
  new Object[] { 28, 30, 32, 34 }
};

デカルト積を計算するには、拡張メソッドを呼び出すだけです。

var result = sequences.CartesianProduct();

結果を列挙すると、その場で (遅延して) 計算されます。リストのリストを作成したい場合は、拡張メソッドから戻る前とToList()後で呼び出す必要があります。Concatresult

于 2013-06-08T06:49:09.847 に答える