【问题标题】:how to use linq on a list<T> to generate a list<lists<T>> in C#如何在列表<T> 上使用 linq 在 C# 中生成列表<lists<T>>
【发布时间】:2010-08-17 23:52:21
【问题描述】:

我已经看到了反向问题的示例,但它们在这个方向上没有帮助我。

我有一个列表,其中 T 具有 int 权重。我想把它分成按重量分组的 5 个列表。
如果我有以下具有各自权重的 T
答:1
B:2
C:3
D:4
E:5
F:6
G:7
H:8
我:9
J:-11
我希望将 {A,B,C,D,E,F,G,H,I,J} 排序为 {{J,A,B,C,D},{E,F,G,H,I }}
我不担心列表中的项目数不能被 5 整除的情况。我也不担心列表的内部被排序。例如,我会对 {{J,A,B,C,D},{F,I,G,H,E}} 甚至 {{F,I,G,H,E},{J ,A,B,C,D}}

【问题讨论】:

  • 定义的重量是多少?它是如何计算的?
  • 权重是 T 的公共成员,它是一个 int
  • 在这种情况下,您在大括号之间显示的 int 值是什么?那是T上的另一个属性吗?为什么不向我们展示 T 的样子?将非常有帮助并增加清晰度。
  • 您希望它如何划分?
  • 澄清了这个问题,我认为这很清楚,但说话的人总是认为这对其他人来说很明显:P

标签: c# linq generics list sorting


【解决方案1】:
var query = data.OrderBy(x => x.Weight)
                .Select((x, i) => new { Value = x, Group = i / 5 })
                .GroupBy(x => x.Group, x => x.Value, (k, g) => g.ToList())
                .ToList();

如果您对 query 被简单地输入为 IEnumerable&lt;IEnumerable&lt;T&gt;&gt; 而不是 List&lt;List&lt;T&gt;&gt; 感到满意,那么您可以完全省略 ToList 调用:

var query = data.OrderBy(x => x.Weight)
                .Select((x, i) => new { Value = x, Group = i / 5 })
                .GroupBy(x => x.Group, x => x.Value);

【讨论】:

  • 我喜欢 i / 5 技巧——但我强烈建议在这行解释它的代码上方添加注释,否则对于代码的读者来说太不明显了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
相关资源
最近更新 更多