多くのカスタム Enumerable 拡張機能は、他の組み込み操作の観点から実装できます。たとえば、次の簡単な便利なメソッドです。
public static bool AnyOf<TElement>(this TElement item, IEnumerable<TElement> items)
{
return items.Any(a => EqualityComparer<TElement>.Default.Equals(a, item));
}
これで、PLINQ にも Any - が含まれていても、すべての PLINQ クエリが強制的に順次操作に戻され、署名を変更するだけで同等になります。
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 メソッドは、たとえコンパイルされたとしても、すべてが同等であるとは限らないことも考慮する価値があります。