Как подгруппировать группу в linq? - PullRequest
2 голосов
/ 23 июня 2010

Я пытаюсь подгруппировать группу, используя linq. Это оказывается сложнее, чем я думал. До сих пор я использовал быстрый и грязный подход, но он не так эффективен, как хотелось бы. Могут ли эти два оператора linq быть упрощены до одного?

        var basketBalls = from Ball ball in Balls
                        where ball.IsBasketBall())
                        group ball by new { Color = ball.Color, IsBasketBall= ball.IsBasketBall(), Size = ball.Size } into Group
                        where Group.Count() > 0
                        select Group;

        var nonBasketBalls = from Ball ball in Balls
                        where !ball.IsBasketBall())
                        group ball by new { Color = ball.Color, IsBasketBall= ball.IsBasketBall(), Size = ball.Size, Material = ball.Material } into Group
                        where Group.Count() > 0
                        select Group;

Вот что пытаются сделать два утверждения на простом английском языке. Найдите все шары, которые являются баскетбольными мячами, и сгруппируйте их по цвету и размеру. Если они не баскетбольные, то сгруппируйте их по цвету, размеру и материалу. Возможно ли сделать это в кратком выражении linq?

1 Ответ

2 голосов
/ 23 июня 2010

Ключевая проблема, которая делает это трудным, состоит в том, что типы двух результатов, которые вы получаете, различны, потому что два запроса используют разные ключи - и это означает, что тип результата отличается.сгруппируйте шары в две группы, в зависимости от того, истинно ли IsBasketBall или нет.Затем вы можете выполнить вложенную группировку, но тип ключей должен быть одинаковым.Вы можете добиться этого, используя тип "побольше" (включая Material), но вы можете использовать некоторое значение DefaultMaterial для элементов в корзине - это означает, что материал фактически не будет использоваться для группировки:

var basketBalls = 
   from Ball ball in Balls 
   group ball by ball.IsBasketBall() into g
   select new {
     IsBasketBall = g.Key,
     Elements = from b in g 
                group b by new { 
                  Color = ball.Color, IsBasketBall= g.Key, Size = ball.Size, 
                  Material = g.Key ? DefaultMaterial : ball.Material }
   }
...