我有一个IEnumerable项目,我想根据相关类别进行分组。这些项目按照与它们相关联的类别进行分组 - 这是一个列表 - 因此单个项目可能是多个类别的一部分。
var categories = numbers.SelectMany(x => x.Categories).Distinct();
var query =
from cat in categories
select new {Key = cat,
Values = numbers.Where(n => n.Categories.Contains(cat))};
我使用上面的代码,它实际上确实有效,但我想知道是否有更有效的方法来执行此操作,因为当数字包含数千个值时,此操作可能会执行得很慢。
我几乎要求重构代码以提高效率。
答案 0 :(得分:2)
您可以使用LINQ的内置分组功能,该功能应该比包含查找更快。但是,与任何与性能相关的问题一样,在决定如何重写您知道的代码之前,您应该编写代码来收集性能指标。可能会发现,您将使用的卷根本没有性能问题。
所以,这是代码。这没有经过测试,但它应该有用:
var result = from n in numbers
from c in n.Categories
select new {Key = c, n.Value}
into x group x by x.Key into g
select g;
每个组都包含一个键和一系列属于该键的值:
foreach( var group in result )
{
Console.WriteLine( group.Key );
foreach( var value in group )
Console.WriteLine( value );
}