8

カテゴリの表があります:

 Catid | Desciption
 1 | Color
 2 | Size
 3 | Material

そして、カテゴリ項目のテーブル

 Catid | Name
 1 | Red
 1 | Blue
 1 | Green
 2 | Small
 2 | Med
 2 l Large
 3 | Cotton
 3 | Silk

すべてのアイテムをループして、次のようなラベルに表示する必要があります。

 Red Small Cotton
 Red Small Silk
 Red Med Cotton
 Red Med Silk
 Red Large Cotton
 Red Large Silk
 Blue Small Cotton
 Blue Small Silk
 Blue Med Cotton
 Blue Med Silk
 Blue Large Cotton
 Blue Large Silk
 Green Small Cotton
 Green Small Silk
 Green Med Cotton
 Green Med Silk
 Green Large Cotton
 Green Large Silk

注意: カテゴリは多かれ少なかれ存在する可能性があります。あらかじめ決められていません。

助言がありますか?ありがとうございました

4

2 に答える 2

21
var result = list.GroupBy(t => t.Id).CartesianProduct();

Eric Lippert のブログのCartesianProduct 拡張メソッドを使用します。

static IEnumerable<IEnumerable<T>> CartesianProduct<T>(
  this IEnumerable<IEnumerable<T>> sequences) 
{ 
  IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() }; 
  return sequences.Aggregate( 
    emptyProduct, 
    (accumulator, sequence) => 
      from accseq in accumulator 
      from item in sequence 
      select accseq.Concat(new[] {item})); 
}

例:

var list = new[]
{
    new { Id = 1, Description = "Red"    },
    new { Id = 1, Description = "Blue"   },
    new { Id = 1, Description = "Green"  },
    new { Id = 2, Description = "Small"  },
    new { Id = 2, Description = "Med"    },
    new { Id = 2, Description = "Large"  },
    new { Id = 3, Description = "Cotton" },
    new { Id = 3, Description = "Silk"   },
};

var result = list.GroupBy(t => t.Id).CartesianProduct();

foreach (var item in result)
{
    Console.WriteLine(string.Join(" ", item.Select(x => x.Description)));
}

出力:

Red Small Cotton
Red Small Silk
Red Med Cotton
Red Med Silk
Red Large Cotton
Red Large Silk
Blue Small Cotton
Blue Small Silk
Blue Med Cotton
Blue Med Silk
Blue Large Cotton
Blue Large Silk
Green Small Cotton
Green Small Silk
Green Med Cotton
Green Med Silk
Green Large Cotton
Green Large Silk
于 2012-05-09T16:06:04.713 に答える
15

クロス結合を使用してみてください。

var combo = from l1 in List1
            from l2 in List2
            select new {l1, l2};
于 2012-05-09T15:56:50.303 に答える