怎样从数组中获取指定数量的数据值,然后打包

川哥编程 2014-01-24 12:00:00
从数组中获取指定数量的数据值,然后打包,这个数组中的的长度是未知的。
例如:数组中有22个数据值,指定每个包为5条数组,则输入如下:
第一个包:01 | 02 | 03 | 04 | 05
第二个包:06 | 07 | 08 | 09 | 10
第三个包:11 | 12 | 13 | 14 | 15
第四个包:16 | 17 | 18 | 19 | 20
第五个包:21 | 22

大致的方法体如下:(剩余的两条未实现打包,怎样将剩余的2条计算并打包)
protected void Test() {

//每行输出的数量
const int PACKAGE = 5;

//该数组的元素数量是未知的,当前假设有22个数据值。
String[] arr = new String[22] { "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22" };
int count = arr.Length;
int n = 0;
String[] a = new String[PACKAGE];
for (int i = 0; i < count; i++) {
n++;
a[n - 1] = arr[i];
if (n == PACKAGE) {
Console.WriteLine(String.Join("|", a) + "\r\n");
n = 0;
a = new String[PACKAGE];
}
}
}
/*

想要的输出结如下:(数组中有N个元素,按照 PACKAGE 的值换行)
01 | 02 | 03 | 04 | 05
06 | 07 | 08 | 09 | 10
11 | 12 | 13 | 14 | 15
16 | 17 | 18 | 19 | 20
21 | 22


*/
...全文
591 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
川哥编程 2014-01-24
  • 打赏
  • 举报
回复
发现这种方法能满足我的需求,哪位还有更简洁的算法吗? protected void Test() { //包的大小 const int PACKAGE = 5; //该数组的元素数量是未知的 String[] arr = new String[22] { "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22" }; int count = arr.Length; //是否遍历完毕 bool completed = false; //创建 ACKAGE 大小的数组 String[] a = new String[PACKAGE]; int n = 0; for (int i = 0; i < count; i++) { n++; a[n - 1] = arr[i]; if (i == count - 1) { completed = true; } if (n == PACKAGE) { //打印符合 PACKAGE 大小的包 Console.WriteLine(String.Join("|", a)); //将 PACKAGE 计数器归零 n = 0; //重新创建 ACKAGE 大小的数组 a = new String[PACKAGE]; } } //删除数组中的空元素 String[] list = (from s in a where !String.IsNullOrEmpty(s) select s).ToArray(); //打印剩余的包 Console.WriteLine(String.Join("|", list)); if (completed) { //do something here } }
川哥编程 2014-01-24
  • 打赏
  • 举报
回复
首先谢谢楼上各位的帮助,上楼的几位没有实现想要的结果,也许是我没有描述清楚吧。 从数组 arr 中提取符合 PACKAGE 大小的元素,打包成 PACKAGE 大小,如何将 PACKAGE 和数组 arr 中的不能整除的余数如何打包。 比如数组中有22个元素,PACKAGE = 10,结果将打成三个包,其中2个包中都有10个元素,第三个只有2个元素。 还有,打包后的每个数据之间要用分隔符“|”,所以感觉用 String.Join("|", arr) 要比用 List 简单些。
  • 打赏
  • 举报
回复

String[] arr = new String[22] { "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22" };
            var packages = arr.Select((s, i) => new { s, i })
                .GroupBy(item => item.i / 5)
                .Select(g => g.Select(item => item.s + (item.i % 5 == 4 || item.i == arr.Length - 1 ? "\r\n" : "|")).ToArray())
                .ToList();
            foreach (string[] package in packages)
                Console.Write(string.Join(" ", package));
bdmh 2014-01-24
  • 打赏
  • 举报
回复

                if (n == PACKAGE)
                {
                    MessageBox.Show(String.Join("|", a));
                    n = 0;
                    a = new String[PACKAGE];
                }
                else if (i == count - 1 && n < PACKAGE)
                {
                    MessageBox.Show(String.Join("|", a));
                }
tcmakebest 2014-01-24
  • 打赏
  • 举报
回复
还有比这更简单的问题么? if (n == PACKAGE) 改成 if (n == PACKAGE || i==count-1) a 改成 List<string> 类型

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧