我有一个数据列表,我想在GUI(HTML)中显示为一个表。
我想创建一个lambda表达式,以便将一百个项目列表分成20行,每行5个项目。我可以创建一个简洁的lambda表达式来执行此操作吗?
这就是我提出的(是的,5是一个幻数,它是每行的项数):
bool isCreateNewRow = true;
var aggregate = Model.Aggregate(new Collection<ICollection<Album>>(),
(tableCollection, album) =>
{
if (isCreateNewRow)
{
tableCollection.Add(new Collection<Album>());
isCreateNewRow = false;
}
tableCollection.Last().Add(album);
if(tableCollection.Last().Count() >= 5)
{
isCreateNewRow = true;
}
return tableCollection;
});
是否有更短的方法来创建二维数据结构(IEnumerables的IEnumerables)?
答案 0 :(得分:3)
这将更容易
a)创建(1D)结果集
b)使用1或2个for
循环以表格形式处理(呈现)这些结果。
另外,因为这两个步骤在逻辑上属于解决方案的不同层。
答案 1 :(得分:1)
// Create 20 dummy items.
var albums = Enumerable.Range(1, 20)
.Select(i => string.Format("Album {0}", i));
// Associate each one with the row index.
var numbered = albums
.Select((item, index) =>
new { Row = index / 3, Item = item });
// Arrange into rows.
var table = numbered
.GroupBy(x => x.Row)
.Select(g => g.Select(x=>x.Item).AsEnumerable());
此时,table
是IEnumerable<IEnumerable<string>>
。
要将其转换为HTML,请尝试以下操作:
var html = rows.Aggregate(
new StringBuilder("<table>"),
(tableBuilder, row) => {
tableBuilder.AppendFormat("<tr>{0}</tr>",
row.Aggregate(new StringBuilder(),
(rowBuilder, cell) => {
rowBuilder.AppendFormat("<td>{0}</td>", cell);
return rowBuilder;
}));
return tableBuilder;
},
(tableBuilder) => {
tableBuilder.Append("</table>");
return tableBuilder;
});