为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Linq 表达式树从 Span<T> 中获取值?

如何使用 Linq 表达式树从 Span<T> 中获取值?

C#
慕运维8079593 2021-12-25 16:32:33
我想使用 Linq 表达式树来调用Span<T>. 代码如下:var spanGetter = typeof(Span<>)    .MakeGenericType(typeof(float)).GetMethod("get_Item");var myFloatSpan = Expression.Parameter(typeof(Span<float>), "s");var myValue = Expression.Call(    myFloatSpan,    spanGetter,    Expression.Constant(42));var myAdd = Expression.Add(    myValue,    Expression.Constant(13f));    然而,这段代码失败了,因为myValue是类型Single&(aka ref struct)而不是类型Single(aka struct)。如何Span<T>从表达式树评估 a ?
查看完整描述

1 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

我有一个解决方案,但正如您将看到的,它远非理想。我们重用了 C# 语法糖引擎。


class Program

{

    static void Main(string[] args)

    {

        var spanGetter = typeof(Program).GetMethod("GetItem").MakeGenericMethod(typeof(float));


        var myFloatSpan = Expression.Parameter(typeof(Span<float>), "s");


        var myValue = Expression.Call(

            null,

            spanGetter,

            myFloatSpan,

            Expression.Constant(42));


        var myAdd = Expression.Add(

            myValue,

            Expression.Constant(13f));


        var expr = Expression.Lambda<MyFunc>(myAdd, myFloatSpan).Compile();


        var span = new Span<float>(new float[43]);

        span[42] = 12.3456f;

        Console.WriteLine(expr(span)); // -> 25.3456

    }


    // hopefully, this shouldn't be too bad in terms of performance...

    // C# knows how to do compile this, while Linq Expressions doesn't

    public static T GetItem<T>(Span<T> span, int index) => span[index];


    // we need that because we can't use a Span<T> directly with Func<T>

    // we could make it generic also I guess

    public delegate float MyFunc(Span<float> span);

}


查看完整回答
反对 回复 2021-12-25
  • 1 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信