2010-08-25 90 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); 
}