Элементы группы LINQ.Один предмет может быть в нескольких группах - PullRequest
2 голосов
/ 26 августа 2010

У меня есть 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))};

Я использую приведенный выше код, и он действительно работает, но мне было интересно, есть ли более эффективный способ сделать это, потому что эта операция, вероятно, будет выполняться медленно, когда числа содержат тысячи значений.

Я прошу сделать рефакторинг кода более эффективным.

1 Ответ

2 голосов
/ 26 августа 2010

Вы можете использовать встроенные возможности группировки 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 );
}
...