【问题标题】:Defining a lambda expression with an anonymous type contained within that lambda使用包含在该 lambda 中的匿名类型定义 lambda 表达式
【发布时间】:2010-08-10 07:17:24
【问题描述】:

我试图避免在我的 lambda 表达式中使用动态类型来对集合进行分组。该类型是在编译时匿名定义的(据我所知是明确的)。我宁愿不将类型定义为成熟的类,因为我在这个单一方法中只使用了几次。

示例代码:

Func<MyData, dynamic> dataGrouping = md => new
    {
        md.Property1,
        md.Property2,
        md.Property3
    };

var groupedData = myDataCollection.GroupBy(dataGrouping);

虽然这会编译,但它让我在组内没有智能感知或强类型,因为类型是动态的。

我无法将 dataGrouping 的类型指定为 var,因为我在 C# 中,并且收到关于无法将 lambda 表达式分配给隐式类型局部变量的投诉

我可以在匿名类型上用 GetType() 的结果替换 dynamic 吗?然后我需要在 lambda 中使用它之前的类型,但在我已经进入 lambda 本身之前,我看不到一种有用的方法来处理它。

有没有一种优雅的方式来获取这个匿名类的类型?

【问题讨论】:

    标签: c# lambda anonymous-types


    【解决方案1】:

    您有什么理由不想将 lambda 表达式直接放在 GroupBy 调用中?这就是它通常挂在一起的方式:

    var groupedData = myDataCollection.GroupBy(md => new
                             {
                                 md.Property1,
                                 md.Property2,
                                 md.Property3
                             });
    

    可以使用额外的方法来完成这项工作:

    static Func<TSource, TResult> CreateFunction<TSource, TResult>
        (Func<TSource, TResult> function)
    {
        return function;
    }
    

    然后使用类型推断:

    var dataGrouping = CreateFunction((MyData md) => new
    {
        md.Property1,
        md.Property2,
        md.Property3
    });
    

    请注意我是如何明确键入参数的,以便类型推断可以使用。这会起作用,但它有点难看。我会将 lambda 表达式直接嵌入到方法调用中,除非您有任何特殊原因不这样做。

    【讨论】:

    • 正是我要建议的......但你比往常领先一步;)
    • 感谢您的回复。我不想将 lambda 直接放在 GroupBy 中的原因是我打算在这个函数中的几个不同的 MyData 集合上使用这个分组,并且我试图只定义一次。
    • @Daniel:很公平。在这种情况下,“额外方法”方法应该可以工作,即使它有点难看。
    猜你喜欢
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多