GroupBy LINQ中的两个属性之一

时间:2014-10-29 06:09:46

标签: c# linq

我知道很容易通过两个属性对对象进行分组,但我想知道是否可以通过两个属性中的任何一个进行分组?可能下面的例子会更清楚: -

假设我有这张表: -

CategoryID        Fruit
-------------------------
1                 Apple
1                 Grapes
2                 Tablet
2                 Laptop
5                 Coke
6                 Coke

现在,如果CategoryIds相同或者水果相同,我想将这些数据分组。

示例输出: -

Group 1:-
1          Apple
1          Grapes

Group 2:-
2          Tablet
2          Laptop

Group 3:-
5          Coke
6          Coke

1 个答案:

答案 0 :(得分:3)

要根据您的要求添加一些详细信息,您似乎希望在CategoryID上执行常规组。然后,如果任何组只包含一个元素,您希望这些元素按Fruit分组。该群组的密钥必须同时包含CategoryIDFruit。对于示例数据中的第1组和第2组,Fruit属性将是Fruit的默认值。对于第3组,CategoryID将是CategoryID的默认值。

您可以通过执行两个嵌套分组然后再次展开内部分组来执行此计算:

var groupedItems = items
  .GroupBy(item => item.CategoryID)
  .GroupBy(
    inner => inner.Count() > 1
      ? new { CategoryID = inner.Key, Fruit = default(String) }
      : new { CategoryID = default(Int32), inner.First().Fruit }
  )
  .Select(
    outer => outer.Count() == 1
      ? new { outer.Key, Items = outer.First().ToList() }
      : new { outer.Key, Items = outer.Select(inner => inner.First()).ToList() }
  );

鉴于此输入

var items = new[] {
  new { CategoryID = 1, Fruit = "Apple" },
  new { CategoryID = 1, Fruit = "Coke" },
  new { CategoryID = 2, Fruit = "Tablet" },
  new { CategoryID = 2, Fruit = "Coke" },
  new { CategoryID = 5, Fruit = "Coke" },
  new { CategoryID = 6, Fruit = "Coke" }
};

你得到这个输出

Key             |Items
----------------+-----------------
CategoryId Fruit|CategoryID Fruit
----------------+-----------------
1          null |1          Apple
                |1          Coke
----------------+-----------------
2          null |2          Tablet
                |2          Coke
----------------+-----------------
0          Coke |5          Coke
                |6          Coke
----------------+-----------------