разделить SortedList на несколько списков или массивов [дубликаты]

Возможный дубликат:
Как разбить массив на группу по n элементов в каждой?

Я считаю, что упростил этот вопрос, поэтому немного его редактирую. Из консольного приложения .NET 3.5 у меня есть строка SortedList, строка, которая будет содержать неизвестное количество пар ключ/значение. Я получу эту коллекцию, прочитав строки из таблицы в документе Microsoft Word. После этого пользователь сможет добавлять в эту коллекцию дополнительные элементы. После того, как пользователь завершил добавление в коллекцию, мне нужно записать коллекцию обратно в новый документ Microsoft Word. Сложность заключается в том, что элементы должны быть записаны обратно в документ в алфавитном порядке в таблицу с несколькими столбцами, сначала вниз по левой стороне таблицы, а затем по правой стороне таблицы, и поскольку вывод, вероятно, будет распределен по нескольким страницам. необходимо также сохранить порядок на нескольких страницах. Таким образом, первая таблица на первой странице может содержать от A до C в левой части таблицы и от C до F в правой части таблицы, тогда, если таблица превышает страницу, требуется новая таблица. Новая таблица может содержать буквы от F до I и правую часть от L до O. Поскольку таблица, скорее всего, будет занимать несколько страниц, и я знаю максимальное количество строк в таблице на странице, я могу выполнить математические расчеты, чтобы определить, сколько таблиц мне потребуется в целом. . Это изображение представляет выходные данные: table output
Для краткости, если выходная таблица может содержать максимум 7 строк на странице и 2 элемента в строке, а у меня 28 элементов, тогда мне нужно будет записать вывод в 2 таблицы, но, конечно, я не буду знать, сколько таблиц мне понадобится, пока не прочитаю данные, поэтому Я не могу просто жестко указать количество выходных таблиц.

Каков наилучший способ взять мой SortedList и разделить его на n коллекций, чтобы создать описанную структуру таблицы?


person JDM    schedule 13.03.2011    source источник
comment
указанный вами пост сделал именно то, что мне было нужно. Благодарность   -  person JDM    schedule 14.03.2011


Ответы (2)


Нет необходимости разбивать список (если единственной целью является запись элементов в таблицу).

Вы можете просто перебирать список и писать разрывы строк в соответствующих местах.

for (int i = 0; i < sortedList.Count; i++)
{
   if (i % 3 == 0)
   {
       Console.Write("|"); // write beginning of the row
   }
   Console.Write(sortedList[i].ToString().PadRight(10)); // write cell
   Console.Write("|"); // write cell divider
   if (i % 3 == 2)
   {
      Console.WriteLine() // write end of the row       
   }
}
// optional: write empty cells if sortedList.Count % 3 != 0
// optional: write end of the row if sortedList.Count % 3 != 2

Вы должны расширить свой вопрос, указав, что является результатом вашего скрипта. Если вы хотите записать таблицу в консоль, возможно, приведенное выше решение будет лучшим. Однако, если вы используете многофункциональный пользовательский интерфейс (например, WinForms или ASP.NET), вам следует использовать встроенные инструменты и элементы управления для отображения данных в таблице.

person bobannn    schedule 13.03.2011

Я немного поигрался с LINQ и придумал это решение. Он создает некую древовидную структуру на основе «входных параметров» (rowsPerPage и columnsPerPage). Столбцы на последней странице не могли иметь одинаковый размер (код можно легко исправить, если это проблема).

SortedList<string, string> sortedList ... // input sortedList

int rowsPerPage = 7;
int columnsPerPage = 2;

var result = from col in
                 (from i in sortedList.Select((item, index) => new { Item = item, Index = index })
                 group i by (i.Index / rowsPerPage) into g
                 select new { ColumnNumber = g.Key, Items = g })
             group col by (col.ColumnNumber / columnsPerPage) into page
             select new { PageNumber = page.Key, Columns = page };

foreach (var page in result)
{
    Console.WriteLine("Page no. {0}", page.PageNumber);
    foreach (var col in page.Columns)
    {
        Console.WriteLine("\tColumn no. {0}", col.ColumnNumber);
        foreach (var item in col.Items)
        {
            Console.WriteLine("\t\tItem key: {0}, value: {1}", item.Item.Key, item.Item.Value);
        }
    }
}
person jakubka    schedule 13.03.2011