【发布时间】:2012-12-19 01:56:41
【问题描述】:
许多自定义 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 方法都是等效的,即使它们可以编译。
【问题讨论】:
-
真正的问题是什么?
-
嗯,错了。有点得意忘形:“有没有办法编写一个也适用于 PLINQ 的 LINQ 扩展?”。
-
你所有的扩展方法都这么短吗?你有几个?