2010-08-25 92 views
2

我有一个IEnumerable项目,我想按关联的类别进行分组。这些项目按与它们关联的类别进行分组 - 这是一个列表 - 因此单个项目可能是多个类别的一部分。LINQ组项目。单个项目可能在几个组中

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))}; 

我用上面的代码,它实际上做的工作,但我想知道是否有这样做的,因为这种操作可能会执行缓慢,当数字包含数千个值的更有效的方式。

我几乎要求重构代码以提高效率。

回答

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); 
}