Wiele zwyczaj przeliczalny rozszerzeń mogą być realizowane w warunkach innych wbudowanych operacji - na przykład ten banalny sposób Wygoda:Wykorzystując PLINQ z niestandardowymi przeliczalny Rozszerzenia
public static bool AnyOf<TElement>(this TElement item, IEnumerable<TElement> items)
{
return items.Any(a => EqualityComparer<TElement>.Default.Equals(a, item));
}
Teraz będzie to żadnego zapytania PLINQ powrotem do sekwencyjnego działania chociaż PLINQ posiada również Dowolne - i jest równoznaczne z zaledwie tylko zmianą podpisu:
public static bool AnyOf<T>(this T item, ParallelQuery<T> items)
{
return items.Any(a => EqualityComparer<T>.Default.Equals(a, item));
}
Ale powielenie go tak wydaje mi się bałagan.
Na początku pomyślałem, że coś, co poniżej, może działać, ale oczywiście nie, ponieważ metody rozszerzeń są metodami statycznymi, dlatego decyzja o wywołaniu Enumerable.Any
w przeciwieństwie do ParallelQuery.Any
została podjęta w czasie kompilacji na podstawie podpisu.
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));
}
Doszedłem do wniosku, że to niemożliwe bez tworzenia kopii każdej metody z innym podpisem, ale być może jest coś, co przeoczyłem. (Gee zawsze z niemożliwych pytań!)
Być może lepszym przykładem pomocnika, który mógłby wykorzystać parallelization (może być oczywiście łańcuchy, itp) jest coś takiego.
public static IEnumerable<string> ToStrings(this IEnumerable<object> ienum)
{
return ienum.Select(a=> a.ToString());
}
błąd^Compiler:
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>'
również warte rozważenia jest to, że nie wszystkie ParallelQuery/przeliczalny metody są równoważne, nawet jeżeli się skompilować.
jaki jest rzeczywisty pytanie? – jessehouwing
Umm, err. Trochę porwał: "Czy istnieje sposób na napisanie rozszerzenia LINQ, które również działa z PLINQ?". – Fowl
Czy wszystkie metody rozszerzenia są tak krótkie? Ile ich masz? – svick