用于创建表结果的Lambda表达式

时间:2011-02-20 19:09:16

标签: c# linq lambda

我有一个数据列表,我想在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)?

2 个答案:

答案 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());

此时,tableIEnumerable<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;
    });