为了账号安全,请及时绑定邮箱和手机立即绑定

使用LINQ将集合拆分为‘N’部件?

使用LINQ将集合拆分为‘N’部件?

ABOUTYOU 2019-07-15 15:27:12
使用LINQ将集合拆分为‘N’部件?有什么好办法把一个集合分割成n和LINQ的零件?当然也不一定均衡。也就是说,我想将集合划分为子集合,每个子集合都包含元素的子集,其中最后一个集合可以是粗糙的。
查看完整描述

3 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

纯Linq和最简单的解决方案如下所示。

static class LinqExtensions{
    public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> list, int parts)
    {
        int i = 0;
        var splits = from item in list
                     group item by i++ % parts into part                     select part.AsEnumerable();
        return splits;
    }}


查看完整回答
反对 回复 2019-07-15
?
临摹微笑

TA贡献1982条经验 获得超2个赞

好的,我把我的帽子扔进戒指。我的算法的优点是:

  1. 没有昂贵的乘法、除法或模运算符
  2. 所有操作均为O(1)(见下文注)
  3. 为IEnumerable<>源代码工作(不需要计数属性)
  4. 简约

守则:

public static IEnumerable<IEnumerable<T>>
  Section<T>(this IEnumerable<T> source, int length){
  if (length <= 0)
    throw new ArgumentOutOfRangeException("length");

  var section = new List<T>(length);

  foreach (var item in source)
  {
    section.Add(item);

    if (section.Count == length)
    {
      yield return section.AsReadOnly();
      section = new List<T>(length);
    }
  }

  if (section.Count > 0)
    yield return section.AsReadOnly();}

正如在下面的评论中所指出的,这种方法实际上并没有解决最初的问题,即要求固定数量的大致相同长度的部分。尽管如此,你仍然可以用我的方法来解决原来的问题,你可以这样称呼它:

myEnum.Section(myEnum.Count() / number_of_sections + 1)

当以这种方式使用时,该方法不再是O(1),因为count()操作是O(N)。


查看完整回答
反对 回复 2019-07-15
  • 3 回答
  • 0 关注
  • 360 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信