通过分组拆分Linq列表

时间:2012-06-09 12:21:53

标签: c# linq

出于报告目的,我想将采购订单列表拆分为多个列表。每个购买地址一个列表。我知道可以按购买地址对列表进行分组,但我的问题是如何将此购买地址的列表拆分为多个列表,并使用这些多个列表创建单独的报告文件。

代码:

(from o in orders
group o by new {field1, field2, field3, field4} into og
orderby og.Key.field1
select new ViewClass
{
    purchaseAddress = og.Key.field1,
    product = og.key.field2,
    count = og.count
}).ToList()

问题:如何将上面的列表拆分为每个purchaseAddress的多个列表?

3 个答案:

答案 0 :(得分:10)

我认为有一个内置功能可以满足您的需求。如果我假设你的代码被分配给一个名为query的变量,那么你可以这样写:

ILookup<string, ViewClass> queryLists = query.ToLookup(x => x.purchaseAddress);

这实质上创建了一个列表,您可以像字典一样访问,但每个值都是零个或多个值的列表。类似的东西:

IEnumerable<ViewClass> someList = queryLists["Some Address"];

答案 1 :(得分:2)

只需将每个群组变成一个列表。

select new ViewClass 
{ 
    purchaseAddress = og.Key.field1, 
    product = og.key.field2, 
    count = og.count,
    List = og.ToList()
}).ToList();

哦,你的分组是实体的一种方式,也是页面的另一种方式......只需重新组合。

List<ViewClass> classes = (
  from o in orders   
  group o by new {field1, field2, field3, field4} into og   
  orderby og.Key.field1   
  select new ViewClass   
  {   
    purchaseAddress = og.Key.field1,   
    product = og.key.field2,   
    count = og.count   
  }).ToList();

List<List<ViewClass>> regrouped = (
  from c in classes
  group c by c.purchaseAddress into g
  select g.ToList()
).ToList();

答案 2 :(得分:0)

您可以使用的另一个简单的内置函数是GroupBy函数。它与ToLookup的工作类似,但这意味着您的新列表是IQuerable,而不是字典和其他一些内容(请参阅此article以获得良好的细分)

var newList = orders.GroupBy(x => x.field1);

这将返回按您指定的字段分组的列表列表。