Molte estensioni enumerabili personalizzato può essere implementato in termini di altre operazioni built - per esempio questo metodo comodo banale:Sfruttando PLINQ con personalizzati enumerabili estensioni
public static bool AnyOf<TElement>(this TElement item, IEnumerable<TElement> items)
{
return items.Any(a => EqualityComparer<TElement>.Default.Equals(a, item));
}
Ora, questo costringerà qualsiasi richiesta PLINQ torna a funzionamento sequenziale anche se PLINQ ha anche un Qualsiasi - ed è equivalente con appena solo un cambiamento di firma:
public static bool AnyOf<T>(this T item, ParallelQuery<T> items)
{
return items.Any(a => EqualityComparer<T>.Default.Equals(a, item));
}
Ma duplicando in questo modo sembra disordinato a me.
In un primo momento ho pensato qualcosa di simile al di sotto potrebbe funzionare, ma ovviamente non lo fa^perché i metodi di estensione sono metodi statici e quindi la decisione di chiamare Enumerable.Any
al contrario di ParallelQuery.Any
è fatta al momento della compilazione sulla base di firma.
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));
}
sono giunto alla conclusione che è impossibile senza la creazione di una copia di ogni metodo con una firma diversa, ma forse c'è qualcosa che ho perso. (Gee sempre con le domande impossibili!)
Forse un esempio migliore di un aiutante che potrebbero trarre beneficio dalla parallelizzazione (può ovviamente essere incatenato, ecc) è qualcosa di simile.
public static IEnumerable<string> ToStrings(this IEnumerable<object> ienum)
{
return ienum.Select(a=> a.ToString());
}
errore^del compilatore:
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>'
Anche la pena prendere in considerazione è che non tutto il ParallelQuery/metodi enumerabili sono equivalenti, anche se la compilazione.
qual è la domanda reale? – jessehouwing
Umm, err. un po 'portato via: "C'è un modo per scrivere un'estensione LINQ che funzioni anche con PLINQ?". – Fowl
Tutti i tuoi metodi di estensione sono così brevi? Quanti ne hai? – svick