gpt4 book ai didi

c# - 将多个 lambda 函数组合在一起并高效执行

转载 作者:行者123 更新时间:2023-11-30 15:50:18 24 4
gpt4 key购买 nike

我正在尝试使用 lambda 函数的组合来创建动态过滤器。但 lambda 函数的数量可能会根据用户应用的不同过滤器的数量而有所不同。

我想要这样的东西

//images is a List<ImageInfo>
var result1 = images
.Where(image => image.Bytes < 1000)
.Where(image => image.Height < 100)
.Where(image => image.Width < 100);

高度过滤器仅应用于那些通过字节过滤器的图像。并且宽度过滤器仅适用于通过高度过滤器的那些图像。

但是,用户打开和关闭过滤器的动态方式不允许我创建单个 lambda 函数。

相反,我将创建一个 lambda 函数列表,然后需要将它们应用到图像列表。所以我最终会得到这样的东西;多个单独的 lambda 函数。

var filter1 = images.Where(image => image.Bytes < 1000);
var filter2 = images.Where(image => image.Height < 100);
var filter3 = images.Where(image => image.Width < 100);

如何将多个 lambda 函数连接在一起以获得最终的过滤图像列表?

这是我做的

var result = filter1.Intersect<ImageInfo>(filter2).Intersect<ImageInfo>(filter3);

但每个滤镜都会遍历图像的主列表以获取其图像子集,然后进行交集计算,这会占用太多 CPU。

所以我正在寻找的是一种获取任意 lambda 函数列表(表达式......等等)的方法,并按照我展示的第一个示例执行的方式加入它们。

最佳答案

好的,怎么样:

static Func<T, bool> CombineWithAnd<T>(IEnumerable<Func<T, bool>> filters)
{
return x =>
{
foreach (var filter in filters)
{
if (!filter(x))
{
return false;
}
}
return true;
};
}

这就是你想要的吗?基本上,它捕获 lambda 表达式中的一组过滤器,并在使用返回的 lambda 时一个接一个地应用它们(短路)。显然你也可以用“或”的方式做同样的事情:

static Func<T, bool> CombineWithOr<T>(IEnumerable<Func<T, bool>> filters)
{
return x =>
{
foreach (var filter in filters)
{
if (filter(x))
{
return true;
}
}
return false;
};
}

请注意,如果过滤器集合在调用该方法后被修改(例如,它是一个 List<T> 并且您添加了一个新过滤器),则返回的“组合”过滤器将反射(reflect)这些更改。如果您不想要这种行为,请添加:

filters = filters.ToList();

作为方法的第一行,有效地进行复制。请注意,委托(delegate)是不可变的,因此您不必担心它们会发生变化。

关于c# - 将多个 lambda 函数组合在一起并高效执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/756758/

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