我尝试创建一个数据列表,按列字母顺序显示所有菜肴但是我找不到方法,可以任何人帮忙。
在asp.net中使用数据列表或转发器只允许您以水平或垂直字母顺序显示,例如
Afghan Asian Burmese Cambodian
Chinese Croatian European French
Greek Indian International Italian
我想拥有的是
Afghan Chinese Greek
Asian Croatian Indian
Burmese European International
Cambodian French Italian
谢谢
答案 0 :(得分:1)
nickf的回答帮助我找到了以下方法,该方法将根据需要转换列表:
public static List<T> ReorderListIntoColumns<T>(List<T> list, int totalColumns)
{
List<T> reordered = new List<T>();
int itemsPerColumn = (int) list.Count / totalColumns;
for (int i = 0; i < itemsPerColumn; i++)
{
for (int j = 0; j < totalColumns; j++)
{
reordered.Add(list[(j * itemsPerColumn) + i]);
}
}
return reordered;
}
即使没有接受的答案,这个主题也似乎获得了很多观点。希望这会帮助其他人,这需要以这种方式重新排序列表!
答案 1 :(得分:0)
我要做的是按字母顺序获取列表,然后重新排列,以便在使用datalist / repeater默认排序时,它采用您想要的格式。
奇怪的伪代码。
/*
your input is A,B,C,D,E,F,G,H,I,J,K,L
given this order, it returns:
A, B, C
D, E, F
G, H, I
J, K, L
but you want
A, E, I
B, F, J
C, G, K
D, H, L
So you need to change your input to this:
A,E,I,B,F,J,C,G,K,D,H,L
*/
let numColumns = 3;
let numItems = 12;
let itemsPerColumn = numItems / numColumns;
loop i from 0 to itemsPerColumn - 1
loop j from 0 to numColumns - 1
newOrdering.push(oldOrdering[i * numColumns + j])
可能有一些漂亮的.NET功能可以改变排序方式,但这只是一种老式的方法。
PS:这是在最好的情况下工作,即项目数量可以被列数整除。你必须对不同的值进行一些调整。
答案 2 :(得分:0)
我最近使用PlaceHolder
和自定义表格完成了此操作:
<asp:PlaceHolder ID="locationTablePlaceHolder" runat="server"/>
然后在支持代码中:
DataView view = locations.Tables[0].DefaultView;
view.Sort = "locationName";
Table table = new Table();
locationTablePlaceHolder.Controls.Clear();
locationTablePlaceHolder.Controls.Add(table);
// enumerator to loop through all items in the DataView
IEnumerator enumerator = view.GetEnumerator();
enumerator.Reset();
// first create all the row objects since we want to populate
// column by column.
int rowCount = 5;
int colCount = 5;
for (int i = 0; i < rowCount; i++)
{
TableRow row = new TableRow();
table.Rows.Add(row);
}
// then loop through each column taking items from the enumerator
// to populate the table
for (int j = 0; j < colCount; j++)
{
for (int i = 0; i < rowCount; i++)
{
TableCell cell = new TableCell();
if (enumerator.MoveNext())
{
Label label = new Label();
label.Text = (String)((DataRowView)enumerator.Current).Row["locationName"];
cell.Controls.Add(label);
table.Rows[i].Cells.Add(cell);
}
}
}