从lambda中调用一个函数

时间:2014-03-05 09:22:04

标签: c# .net lambda

有没有办法从lambda表达式中调用函数?

我们目前有以下

 var obj = m.Select(x => x.ToDictionary(y => y.ColumnName, y => y.ColumnValue))
             .ToList();


private static string BuildNewContent(EnumColumnType columnType, String columnValue, List<TableColumn> CurrentRow)
    {
}

所以我们真正想做的是将BuildNewContent的返回值添加为字典的值。 如下所示: -

var obj = m.Select(x => x.ToDictionary(y => y.ColumnName, BuildNewContent(y => y.ColumnType, y=> y.ContentValue, y)))
             .ToList();

我意识到我们可以通过简单的循环轻松实现这一点,但是,我们希望看到如何使用Lambda(如果可能)这样做

UPDATE - 根据要求,M的类型是TableViewModel,它是一个嵌套列表

public class TableViewModel 
{
   public List<List<TableColumn>> Grid { get; set; }
}

 public class TableColumn
{
    public TableColumn() { }

    public TableColumn(string columnHeader, string columnValue, int columnWidth, EnumColumnType columnType, string columnName)
    {
        this.ColumnHeader = columnHeader;
        this.ColumnValue = columnValue;
        this.ColumnWidth = columnWidth;
        this.ColumnType = columnType;
        this.ColumnName = columnName;
    }

    public string               ColumnHeader    { get; set; }
    public string               ColumnName      { get; set; }
    public string               ColumnValue     { get; set; }
    public int                  ColumnWidth     { get; set; }
    public EnumColumnType       ColumnType      { get; set; }  
}

2 个答案:

答案 0 :(得分:5)

你几乎没错了

var obj = m.Select(x => x.ToDictionary(
    y => y.ColumnName, y => BuildNewContent(y.ColumnType, y.ContentValue, y))).ToList();

但是我怀疑您要提供y或其他值的最后一个x参数,因为y可能不是List<TableColumn>类型

答案 1 :(得分:1)

您尝试过的问题只是BuildNewContent方法的参数 - 当它们应该只是值时,您提供lambda表达式。所以我怀疑你想要:

var obj = m.Select(x => x.ToDictionary(y => y.ColumnName,
                               BuildNewContent(y.ColumnType, y.ContentValue, y)))
           .ToList();

目前尚不清楚y的类型是什么,所以很难知道这是否真的会立即起作用,但是在lambda表达式中调用方法肯定完全可行

但是,如果m类似于LINQ to SQL表,那么在执行时失败 - 在这种情况下,LINQ提供将需要尝试转换表达式树(编译器已经从lambda表达式创建到SQL中,并且它不知道BuildNewContent的意图。如果它只是LINQ to Objects,那很好。