【问题标题】:Group a sorted list without affecting the sorting in linq对排序列表进行分组而不影响 linq 中的排序
【发布时间】:2014-04-02 06:04:14
【问题描述】:

我有对象列表。我需要按属性排序,然后按一组其他属性对结果进行分组,但这样做只会更改排序并首先维护组。如果需要,我需要在保持排序的同时分离组。 我尝试了两种方法

  1. 简单的排序和分组

model.OrderBy(o => o.OrderKey).GroupBy(o=> new {o.Key1, o.Key2})

  1. 按有序列表 (PLINQ) 排序,然后按组排序

model.OrderBy(o => o.OrderKey).AsParallel().AsOrdered().GroupBy(o=> new {o.Key1, o.Key2})

我的输入会是这样的

OrderKey Key1 Key2
a        1    2
b        1    2
c        1    3
d        1    2

我希望输出是这样的

[
  [a, 1, 2],
  [b, 1, 2]
],
[
 [c, 1, 3]
],
[
 [d, 1, 2]
]

【问题讨论】:

标签: c# linq sorting grouping


【解决方案1】:

这可以使用每个项目的索引来解决,并添加一些逻辑来与上一个项目进行比较(除非索引为0):

// Example data
var list = new List<dynamic>{
            new {orderKey = "a", key1 = 1, key2 = 2},
            new {orderKey = "b", key1 = 1, key2 = 2},
            new {orderKey = "c", key1 = 1, key2 = 3},
            new {orderKey = "d", key1 = 1, key2 = 2}
    };

var groupNr = 0; // initial group

var sorted = 
        list
            .OrderBy(i => i.orderKey)
            // Create a new item for each, adding a calculated groupNr:
            .Select((i, nr) => 
                       new { 
                            i.orderKey, 
                            i.key1, 
                            i.key2, 
                            groupNr = (nr == 0 // check if first group
                                           ? 0 // first groupNr must be 0
                                           : (i.key1 == list[nr-1].key1 
                                                && i.key2 == list[nr-1].key2) 
                                              ? groupNr 
                                              : ++groupNr ) 
        })

     // Now just group by the groupNr we have added:
 .GroupBy(i => i.groupNr);

在 LINQPad 中对此进行测试会得到以下结果,您应该能够从中提取所需的内容:

【讨论】:

    猜你喜欢
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 2010-11-05
    相关资源
    最近更新 更多