代码之家  ›  专栏  ›  技术社区  ›  sports Steven

LINQ:从每组中选择除第一项以外的所有项目

  •  12
  • sports Steven  · 技术社区  · 11 年前

    很容易选择每组中的第一个:

            var firstOfEachGroup = dbContext.Measurements
                .OrderByDescending(m => m.MeasurementId)
                .GroupBy(m => new { m.SomeColumn })
                .Where(g => g.Count() > 1)
                .Select(g => g.First());
    

    但是
    问题 :如何从每个组中选择除第一项之外的所有项?

            var everythingButFirstOfEachGroup = dbContext.Measurements
                .OrderByDescending(m => m.MeasurementId)
                .GroupBy(m => new { m.SomeColumn })
                .Where(g => g.Count() > 1)
                .Select( ...? );
    

    其他信息:
    我的真正目标是删除除最后一个之外的所有重复项(以批量方式,即:不使用内存中的foreach),因此在上一个查询之后,我希望使用 RemoveRange :

     dbContext.Measurements.RemoveRange(everythingButFirstOfEachGroup);
    

    所以,如果我 问题 没有意义,这些信息可能很有用。

    3 回复  |  直到 11 年前
        1
  •  12
  •   sports Steven    11 年前

    使用 Skip(1) 跳过第一条记录并选择其余记录。

    类似于:

    var firstOfEachGroup = dbContext.Measurements
                        .OrderByDescending(m => m.MeasurementId)
                        .GroupBy(m => new { m.SomeColumn })
                        .Where(g => g.Count() > 1)
                        .SelectMany(g => g.OrderByDescending(r => r.SomeColumn).Skip(1));
    

    参见: Enumerable.Skip

    如果不需要展平的集合,请替换 SelectMany 具有 Select 在代码段中。

        2
  •  3
  •   SLaks    11 年前

    IGrouping<K, V> 工具 IEnumerable<V> ; 您只需跳过select子句,即可将其应用于每个组:

    .Select(g => g.Skip(1))
    
        3
  •  0
  •   JosephDoggie    11 年前

    您可以始终使用.Distinct()删除重复项;大概是排序或反向排序,然后应用.distinct()将得到您想要的结果。