C# 将数组分组进行平均拆分成多个数组 代码如何实现

编程开发
898
C#
指定数量
数组进行平均分
平均拆分
数组分组
代码如何实现

之前做多线程开发时碰到的一个需求用到,因为处理的数据量较大(单线程网速跑不满,必须多线程传才能跑满带宽,一个线程打包多了就传不动,各种奇葩甲方环境),只能采取多线程并发处理,但是不限制的单个数据开一个线程服务器又吃不消,为了将就线程数、效率、硬件性能之间的平衡最终就采用了数据数组拆成指定数量任务组控制需要要开的线程数量,大致在线程数量和服务器性能之间找到了一个大致平衡的效率区间,下面是实现对数组进行二次拆分分组的泛型映射通用代码

C# 将数组分组进行平均拆分成多个数组#center

2024-11-29 更新(代码优化)

由于最近涨知识了 所以对代码基于Queue队列重构做了一次逻辑优化,以下是优化过的代码(站长整理成了一个静态帮助类型 )

  /// 
  /// 队列帮助类
  /// 
  public static class QueueHelper
  {
      /// 
      /// 去除队列里的指定数量
      /// 
      /// 
      /// 
      /// 
      /// 
      public static bool TryDequeueSpecifiedCount(this Queue queue, int count, out List items)
      {
          items = new List();
          for (int i = 0; i < count; i++)
          {
              if (!queue.TryDequeue(out T item)) break;
              items.Add(item);
          }
          return items.HasItems();
      }

      /// 
      /// 按指定均分数量分组
      /// 
      /// 
      public static List> QueueSpiltGroups(this List list, int count)
      {
          if (!list.HasItems()) return null;
          List> result = new List>();
          Queue queue = new Queue();
          foreach (var item in list) queue.Enqueue(item);
          while (queue.HasItems())
          {
              if (!queue.TryDequeueSpecifiedCount(count, out List items)) break;
              result.Add(items);
          }
          return result;
      }
  }

新代码调用示例

//将一个 List 长度为13 数组拆分成 4个一组 最后一组为余下的数量
List<int> TestStrs=new List<int>(){0,1,2,3,4,5,6,7,8,9,10,11,12};
///拆分数组调用例子
Listint>> groups = TestStrs.QueueSpiltGroups(5);

老版本的代码实现

发现有点逻辑问题,不建议使用了

/// 
/// 按指定数量均分
/// 
/// 
private static List> SpiltList(List Lists, int num) 
{
            List> fz = new List>();
            //元素数量大于等于 分组数量
            if (Lists.Count >= num)
            {
                int avg = Lists.Count / num; //每组数量
                int vga = Lists.Count % num; //余数
                for (int i = 0; i < num; i++)
                {
                    List cList = new List();
                    if (i + 1 == num)
                    {
                        cList = Lists.Skip(avg * i).ToList();
                    }
                    else
                    {
                        cList = Lists.Skip(avg * i).Take(avg).ToList();
                    }
                    fz.Add(cList);
                }
            }
            else
            {
                //最后一组 数量<=num
                fz.Add(Lists);//元素数量小于分组数量
            }
            return fz;
}

后端调用例子

//将一个 List 长度为13 数组拆分成 4个一组 最后一组为余下的数量
List<int> TestStrs=new List<int>(){0,1,2,3,4,5,6,7,8,9,10,11,12};
///拆分数组调用例子
Listint>> = SpiltList<int>(TestStrs, 4);

执行输出结果

第一组:0,1,2,3
第二组:4,5,6,7
第三组:8,9,10,11
第四组:12

C#控制台程序右上角的关闭按钮怎么屏蔽
使用C#为MP3文件添加封面、专辑和歌手信息的实例教程
多线程使用Image.FromFile 加载图片时出现图片文件被锁定无法更新
C# 实现对windows防火墙的常规操作管理白名单、黑名单
vs编译时报错 不安全代码只会在使用 /unsafe 编译的情况下出现
.NET5框架下使用HttpListener类实现http接口监听替代OWIN自我寄宿
C# 二维码生成源码|使用ThoughtWorks.QRCode 实现根据文本内容生成二维码
 C# 实现 Rsa字符串非对称加密简单例子
VS错误提示无法嵌入互操作类型“IWshShell_ClassClass”,请改用适用的接口的解决方法
C# 操作DOS添加端口防火墙名单
C#实现查询某个端口是被哪个程序进程占用
C# 中使用const 常量可能会出现的版本更新问题!
暂无相关内容...
基于.NET4.0实现的目录文件新增监视并自动化上传至ftp完整流程工具源码
[人脸检测]基于C#OpenCvSharp+haarcascade人脸、人眼模型实现人脸检测源码
.NET5+C# WPF实现图片添加倾斜文字平铺水印工具源码
C#基于OpenCVSharp实现图片对比相似度百分比源码下载
C#结合虫洞软件(Wormhole)实现自动登录到手机版百度网盘的流程源码
免责声明 部分转载分享内容若侵犯您的权益,还请 邮件联系 侵删