2011-03-13 120 views
0

可能重複:
How to split an array into a group of n elements each?分裂排序列表到多個列表或數組

我相信我過於簡化了這個問題,所以我編輯了一點。在.NET 3.5控制檯應用程序中,我有一個SortedList字符串,它將包含未知數量的鍵/值對。我將通過讀取Microsoft Word文檔中的表中的行來獲取此集合。用戶將能夠添加額外的項目到這個集合中。一旦用戶完成添加到集合中,我需要將集合寫回新的Microsoft Word文檔。難點在於必須按照字母順序將這些項目回寫到多列表中,首先在表格的左側,然後在表格的右側向下,並且由於輸出可能會跨越多頁I還需要在多個頁面上保持訂單。因此,第一頁上的第一個表格可能包含表格左側的A到C和表格右側的C到F,然後如果表格超過了頁面,則需要新的表格。新表可能包含F到I和右側L到O.Since表可能會跨越多個頁面,並且我知道每個表每頁的最大行數我可以通過計算來確定總共需要多少個表。此圖像是輸出的代表: table output
爲了簡明起見,如果輸出表最多可以包含每行7行和每行2個項目,並且我有28個項目,則需要將輸出寫入2表,但當然我不會知道有多少表需要讀取數據,所以我不能簡單地硬編碼輸出表的數量。

爲了創建所描述的表結構,將SortedList分成n個集合的最好方法是什麼?

+0

您指出的帖子完全符合我的需求。謝謝 – JDM 2011-03-14 20:32:00

回答

0

不需要拆分列表(如果唯一的目的是在表中寫入項目)。

您可以遍歷列表並在合適的位置寫入行分隔符。

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),則應使用內置工具和控件在表格中顯示數據。

0

我用LINQ玩了一下,想出了這個解決方案。它根據「輸入參數」(rowsPerPagecolumnsPerPage)創建某種樹結構。最後一頁上的列不能有相同的大小(如果問題存在,代碼可以很容易地修復)。

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