gpt4 book ai didi

c# - Expression> 变量能否可靠地用作字典中的键?

转载 作者:行者123 更新时间:2023-11-30 14:34:47 27 4
gpt4 key购买 nike

我有一个函数目前使用 Func<T1, T2>作为参数。
我希望它使用 Expression<Func<T1, T2>>作为参数,以便我可以在某些情况下遍历表达式树。

每次调用我都想使用这个函数,所以我需要 Compile()表达方式。为了不必重新编译所有表达式,我想将它们放入字典中。

对我的方法的调用如下所示:

var foo = MyFunc(x => x.Field);

关于 Expression 的使用,以下解决方案是否正确?作为字典键?

static Dictionary<Expression<Func<T1, T2>>, Func<T1, T2>> s_functions = new Dictionary<Expression<Func<T1, T2>>, Func<T1, T2>>();

public T2 MyFunc(Expression<Func<T1, T2>> selectorExpression)
{
if (!s_functions.ContainsKey(selectorExpression))
{
s_functions.Add(selectorExpression, selectorExpression.Compile());
}

Func<T1, T2> selector = s_functions[selectorExpression];
}

编辑

从性能的角度来看,什么是解决它的好方法?

最佳答案

不幸的是不会,但问题只会表现为性能错误。

问题是 Expression<TDelegate> 不执行 IEquatable<Expression<TDelegate>>所以字典使用的默认相等比较器只会做引用相等。这意味着同一表达式的不同实例不会比较相同,这将导致本应命中的缓存未命中。另一方面,不同表达式的实例总是比较不同,因此不存在逻辑错误。

您可以通过提供一个 custom equality comparer 来解决这个问题。字典,但还有一个小问题,那就是必须写一本——这将是一项艰巨的任务。

从好的方面来说,有可能编写一个与原始实现具有相同性能错误的比较器(但缩小了范围)以换取便利——范围的缩小可能解释了所有或大多数情况你真的会遇到!例如,您可能想尝试根据 ToString() 的相等性进行比较交涉。只要比较器不产生任何误报,就只有改进的余地。

关于c# - Expression<Func<T1, T2>> 变量能否可靠地用作字典中的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13365083/

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