gpt4 book ai didi

c# - 利用带有自定义可枚举扩展的 PLINQ

转载 作者:太空狗 更新时间:2023-10-29 20:37:00 29 4
gpt4 key购买 nike

许多自定义 Enumerable 扩展可以根据其他内置操作来实现 - 例如这个简单的便捷方法:

public static bool AnyOf<TElement>(this TElement item, IEnumerable<TElement> items)
{
return items.Any(a => EqualityComparer<TElement>.Default.Equals(a, item));
}

现在这将强制任何 PLINQ 查询返回到顺序操作,即使 PLINQ 也有一个 Any - 并且只相当于一个签名更改:

public static bool AnyOf<T>(this T item, ParallelQuery<T> items)
{
return items.Any(a => EqualityComparer<T>.Default.Equals(a, item));
}

但像这样复制它对我来说似乎很困惑。

起初我认为像下面这样的东西可能会起作用,但当然它不会^因为扩展方法是静态方法,因此决定调用 Enumerable.Any 而不是 ParallelQuery .Any 是在编译时根据签名生成的。

public static bool AnyOf<TElement, TEnumerable>(this TElement item, TEnumerable items)
where TEnumerable : class, IEnumerable<TElement>
{
return items.Any(a => EqualityComparer<TElement>.Default.Equals(a, item));
}

我得出的结论是,如果不为每个方法创建一个具有不同签名的副本是不可能的,但也许我遗漏了什么。 (天哪,总是有不可能的问题!)


也许受益于并行化(显然可以链接等)的助手的一个更好的例子是这样的。

public static IEnumerable<string> ToStrings(this IEnumerable<object> ienum)
{
return ienum.Select(a=> a.ToString());
}

^ 编译器错误:

 The type 'ParallelQuery<TElement>' cannot be used as type parameter
'TEnumerable' in the generic type or method
'AnyOf<TElement,TEnumerable>(TElement, TEnumerable)'. There is no
implicit reference conversion from 'ParallelQuery<TElement>' to
'IEnumerable<TElement>'

另外值得考虑的是,并非所有的 ParallelQuery/Enumerable 方法都是等价的,即使它们可以编译。

最佳答案

我为编写 IQueryable/IEnumerable 扩展做了类似的事情。试图找出公共(public)位涉及声明静态变量持有表达式,然后从函数的两个不同版本引用该表达式。我没有代码了,当我完成时,它非常丑陋,我对它不满意。这是一个简单的例子。

Expression<Func<PersonHistory, bool>> IsCurrent = (p) => p.Ends > DateTime.Now && p.Starts <= DateTime.Now;

//Then in each Extension method:
var query = db.PersonHistories.Where(IsCurrent);

最终去重水平一点也不好,泛型参数会变得更复杂。也许这会给你一个想法。

期待看到其他人的想法。

关于c# - 利用带有自定义可枚举扩展的 PLINQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13944473/

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