C#学习教程:使用Linq和C#创建列表中项目的所有可能组合分享


使用Linq和C#创建列表中项目的所有可能组合

我有一个类别表:

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扩展方法 :

 static IEnumerable> CartesianProduct( this IEnumerable> sequences) { IEnumerable> emptyProduct = new[] { Enumerable.Empty() }; 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 

尝试交叉加入

上述就是C#学习教程:使用Linq和C#创建列表中项目的所有可能组合分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

 var combo = from l1 in LIst1 from l2 in List2 select new {l1, l2}; 

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/959981.html

发表评论

邮箱地址不会被公开。 必填项已用*标注