gpt4 book ai didi

c# - 如何使用 Linq 表达式树从 Span 中获取值?

转载 作者:可可西里 更新时间:2023-11-01 08:47:03 26 4
gpt4 key购买 nike

我想使用 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& (又名 ref struct )而不是类型 Single (又名 struct)。

如何评估 Span<T>来自表达式树?

最佳答案

我有一个解决方案,但它远非理想,如您所见。我们重新使用 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);
}

关于c# - 如何使用 Linq 表达式树从 Span<T> 中获取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52112628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com