Skip to main content
 首页 » 编程设计

c#之当每个项目可以有多个键时,是否可以对集合进行分组

2024年08月06日32qq78292959

我有一个问题,给定的项目可能有多个键,我需要在分组时出现在两个集合中。这可能吗?

项目可能看起来像这样

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将创建一个字典,其中键是每个组的键(类别名称),值是与类别名称关联的项目列表。