我有一个问题,给定的项目可能有多个键,我需要在分组时出现在两个集合中。这可能吗?
项目可能看起来像这样
class Item
{
Category mainCat {get;set;}
IEnumerable<Category> RelatedCategories {get;set;}
String RefNumber {get;set;}
}
class Category
{
String CatName {get;set;}
}
我需要按类别对项目集合进行分组,但如果项目有相关类别,它也需要出现在相关类别的组中。
所以,作为一个最简单的例子,我将在集合中有以下项目实例:
引用:A1 类别:Cat_01 相关类别:{Cat_02}
分组后我想要的输出是:
键:Cat_01,项目 {A1} 键:Cat_02,项目 {A1}
这有可能吗?
请您参考如下方法:
是的,您可以通过以下方式进行。
var dictionary = item.RelatedCategories
.Concat(Enumerable.Repeat(item.mainCat, 1))
.ToDictionary(c => c.CatName, c => item);
这将获取相关类别并连接主要类别并使用 ToDictionary将每个类别名称与给定项目相关联。
如果你正在处理一个项目列表,它会变得更加复杂,因为我假设你需要一个 Dictionary<string, List<Item>>在那种情况下。
var dictionary = items.SelectMany(i => i.RelatedCategories
.Concat(Enumerable.Repeat(i.mainCat, 1))
.Select(c => new { c.CatName, Item = i}))
.GroupBy(a => a.CatName)
.ToDictionary(a => a.Key, a => a.ToList());
这里的内部查询正在创建一个匿名类的枚举,这些匿名类将每个类别名称关联到项目。 SelectMany会将枚举扁平化为一个。然后 GroupBy将根据类别名称将这些匿名类分组。那么ToDictionary将创建一个字典,其中键是每个组的键(类别名称),值是与类别名称关联的项目列表。
