重新排序对象列表,以供标签上下报告
Reorder a list of objects for labels reporting across and then down
我正在尝试使用 Telerik 报告制作标签报告(3 水平 x 5 垂直)。我有一个对象列表(具有代码和名称的客户)。例如,列表有项目:
{ '001', '002', '003', '004', '005', '006', '007', '008', '009', '010', '011', '012', '013', '014', '015' }.
我试试这个样本:https://www.telerik.com/support/kb/reporting/details/how-to-create-multi-column-report---across-the-page-and-then-down
但对我不起作用,因为我没有任何索引字段。
我在运行时将列表绑定到报表,在预览中,我得到:
001 006 011
002 007 012
003 008 013
004 009 014
005 010 015
But I want to get:
001 002 003
004 005 006
007 008 009
010 011 012
013 014 015
我想知道 linq 是否有任何方法可以根据要获取的行数对列表分组重新排序
001, 004, 007, 010, 013, 002, 005, 008, ...
另一个问题是如果项目数少于 15,我应该用空项目填充列表。
谢谢
编辑:
我正在尝试这样的事情:
using System;
using System.Linq;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
int rows = 5;
int columns = 3;
List<string> x = new List<string> { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20" };
for (int i = 0; i < rows; i++)
{
var h = x.Where((c, index) => index % columns == i).Take(rows).ToList();
foreach (var s in h)
{
Console.WriteLine(s);
}
}
}
}
我找到了解决方案。
using System;
using System.Linq;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<string> x = new List<string> { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20" };
/*
* Begin in the label #5
* 001 006 011 => 001 002 003 => --- --- ---
* 002 007 012 => 004 005 006 => --- 001 002
* 003 008 013 => 007 008 009 => 003 004 005
* 004 009 014 => 010 011 012 => 006 007 008
* 005 010 015 => 013 014 015 => 009 010 011 ...
* ----------------------------------------------------------------------------------------
* 016 => 016 017 018
* 017 => 019 020
* 018 => --- ---
* 019 => --- ---
* 020 => --- ---
*/
// Final list of strings or objects
List<string> final = new List<string>();
int firstPosition = 5;
// Add empty items at the beggining
for (int i = 0; i < (firstPosition - 1); i++)
{
x.Insert(0, "-");
}
int rows = 5;
int columns = 3;
int labels = rows * columns;
int pages = x.Count() / labels + ((x.Count() % labels) == 0 ? 0 : 1);
Console.WriteLine("Total labels {0}", x.Count());
Console.WriteLine("Total labels per page {0}", labels);
Console.WriteLine("Total pages {0}", pages);
Console.WriteLine();
for (int page = 0; page < pages; page++)
{
for (int i = 0; i < columns; i++)
{
int r = rows;
var h = x.Skip(page * labels).Where((c, index) => index % columns == i).Take(rows).ToList();
foreach (var s in h)
{
final.Add(s);
r--;
}
for (int j = 0; j < r; j++)
{
final.Add("-");
}
}
}
foreach (var s in final)
{
Console.WriteLine(s);
}
}
}
我只需要从一个位置开始的选项。
编辑:
在列表的开头添加 (firstPosition - 1) 个元素解决起始位置:
for (int i = 0; i < (firstPosition - 1); i++)
{
x.Insert(0, "-");
}
.Net 中的示例 Fiddle:https://dotnetfiddle.net/Gh1t3S
我正在尝试使用 Telerik 报告制作标签报告(3 水平 x 5 垂直)。我有一个对象列表(具有代码和名称的客户)。例如,列表有项目:
{ '001', '002', '003', '004', '005', '006', '007', '008', '009', '010', '011', '012', '013', '014', '015' }.
我试试这个样本:https://www.telerik.com/support/kb/reporting/details/how-to-create-multi-column-report---across-the-page-and-then-down 但对我不起作用,因为我没有任何索引字段。
我在运行时将列表绑定到报表,在预览中,我得到:
001 006 011
002 007 012
003 008 013
004 009 014
005 010 015
But I want to get:
001 002 003
004 005 006
007 008 009
010 011 012
013 014 015
我想知道 linq 是否有任何方法可以根据要获取的行数对列表分组重新排序 001, 004, 007, 010, 013, 002, 005, 008, ... 另一个问题是如果项目数少于 15,我应该用空项目填充列表。 谢谢
编辑: 我正在尝试这样的事情:
using System;
using System.Linq;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
int rows = 5;
int columns = 3;
List<string> x = new List<string> { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20" };
for (int i = 0; i < rows; i++)
{
var h = x.Where((c, index) => index % columns == i).Take(rows).ToList();
foreach (var s in h)
{
Console.WriteLine(s);
}
}
}
}
我找到了解决方案。
using System;
using System.Linq;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<string> x = new List<string> { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20" };
/*
* Begin in the label #5
* 001 006 011 => 001 002 003 => --- --- ---
* 002 007 012 => 004 005 006 => --- 001 002
* 003 008 013 => 007 008 009 => 003 004 005
* 004 009 014 => 010 011 012 => 006 007 008
* 005 010 015 => 013 014 015 => 009 010 011 ...
* ----------------------------------------------------------------------------------------
* 016 => 016 017 018
* 017 => 019 020
* 018 => --- ---
* 019 => --- ---
* 020 => --- ---
*/
// Final list of strings or objects
List<string> final = new List<string>();
int firstPosition = 5;
// Add empty items at the beggining
for (int i = 0; i < (firstPosition - 1); i++)
{
x.Insert(0, "-");
}
int rows = 5;
int columns = 3;
int labels = rows * columns;
int pages = x.Count() / labels + ((x.Count() % labels) == 0 ? 0 : 1);
Console.WriteLine("Total labels {0}", x.Count());
Console.WriteLine("Total labels per page {0}", labels);
Console.WriteLine("Total pages {0}", pages);
Console.WriteLine();
for (int page = 0; page < pages; page++)
{
for (int i = 0; i < columns; i++)
{
int r = rows;
var h = x.Skip(page * labels).Where((c, index) => index % columns == i).Take(rows).ToList();
foreach (var s in h)
{
final.Add(s);
r--;
}
for (int j = 0; j < r; j++)
{
final.Add("-");
}
}
}
foreach (var s in final)
{
Console.WriteLine(s);
}
}
}
我只需要从一个位置开始的选项。
编辑: 在列表的开头添加 (firstPosition - 1) 个元素解决起始位置:
for (int i = 0; i < (firstPosition - 1); i++)
{
x.Insert(0, "-");
}
.Net 中的示例 Fiddle:https://dotnetfiddle.net/Gh1t3S