使用 Linq 和 C# 在列表中创建所有可能的项目组合
本文关键字:有可能 项目 组合 项目组 创建 Linq 列表 使用 | 更新日期: 2023-09-27 18:33:43
我有一个类别表:
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
请注意:可能有或多或少的类别。它不是预先确定的。
有什么建议吗?谢谢
var result = list.GroupBy(t => t.Id).CartesianProduct();
使用 Eric Lippert 博客中的 CartesianProduct Extension 方法:
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
尝试使用交叉连接:
var combo = from l1 in List1
from l2 in List2
select new {l1, l2};