我遇到一个问题,即给定的项目可能有多个键,并且在分组时需要同时出现在两个集合中。这可能吗?
这些项目可能看起来像这样
class Item
{
Category mainCat {get;set;}
IEnumerable<Category> RelatedCategories {get;set;}
String RefNumber {get;set;}
}
class Category
{
String CatName {get;set;}
}
我需要按类别对项目集合进行分组,但是如果项目具有相关类别,则它也需要出现在相关类别的组中。
因此,作为最简单的示例,我将在集合中具有以下item实例:
参考: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
将创建一个字典,其中的键是每个组的键(类别名称),而值是与类别名称关联的项目列表。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句