Переупорядочить список объектов для меток, создающих отчеты по горизонтали и затем вниз - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь создать отчет по меткам (3 по горизонтали x 5 по вертикали) с помощью Telerik Reporting. У меня есть список объектов (клиенты с кодом и именем). Например, в списке есть элементы:

{ '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, я должен заполнить список пустыми элементами. Спасибо.

Edit: Я пытаюсь что-то вроде этого:

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);
            }
        }
    }
}

1 Ответ

0 голосов
/ 18 июня 2019

Я нашел решение.

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);
        }

    }
}

Мне нужен только вариант для старта в одной позиции.

Edit: Добавление (firstPosition - 1) элементов в начале списка решает начальную позицию:

for (int i = 0; i < (firstPosition - 1); i++)
{
    x.Insert(0, "-");
}

Пример в .Net Fiddle: https://dotnetfiddle.net/Gh1t3S

...