【问题标题】:Linq group by columns in a nested collectionLinq 按嵌套集合中的列分组
【发布时间】:2017-04-02 23:08:39
【问题描述】:
IEnumerable<IEnumerable<object>> rows = new List<List<object>
{
  //Columns
  new List<object> { 10, 20, 30, 40, 50 }, 
  new List<object> { 10, 20, 30, 40, 50 },
  new List<object> { 10, 20, 30, 40, 50 },
  new List<object> { 10, 20, 30, 40, 50 } 
}

我基本上想将所有 10 岁、20 岁、30 岁、40 岁、50 岁的人分组。

我想以最好的方式使用 Linq 来完成它。请考虑到我的收藏规模可能高达 2000 万或更多。

我可以通过执行以下操作来实现它,但是当我对组集合执行每个操作时,它会给我带来内存不足的异常。

 IEnumerable<IEnumerable<object>> rows = Enumerable.Repeat(new List<object> { 10, 20, 30, 40, 50 }, 20000000);

 var group = rows.SelectMany(x => x.Select((InnerValue, Index) => new { Index, InnerValue })).GroupBy(x => x.Index);

预期结果如下:

var expectedResult = new List<List<object>
{
  new List<object> { 10, 10, 10, 10, 10 }, 
  new List<object> { 20, 20, 20, 20, 20 },
  new List<object> { 30, 30, 30, 30, 30 },
  new List<object> { 40, 40, 40, 40, 40 } 
}

谢谢。

【问题讨论】:

  • 你能显示结果应该是什么吗?我不完全明白需要什么结果。基本上你想提取列?
  • var allITems = rows.SelectMany(x=&gt;x.Select((value, index) =&gt;new {value, index})); var group1 = allITems.Where(x=&gt;x.index ==0);
  • @Damith 我看不出你的代码和我的代码有什么不同,除了你只是创建了一组 10 个。
  • 我的代码有异常吗?我没有使用 group by..
  • 为什么选择 Linq?这种转换对于 Linq 来说是不自然的,通常也不能推迟,所以简单地迭代构建 List&lt;List&lt;object&gt;&gt; 对我来说是一个很好的解决方案。

标签: c# .net linq ienumerable


【解决方案1】:

如果您想使用 linq :),您可以使用以下查询:

    List<List<object>> expectedResult =
        rows.SelectMany(r => r)
        .ToLookup(k => k, v => v)
        .Select(kv => kv.ToList())
        .ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多