許多自定義可枚舉擴展可以在其他內置的操作來實現 - 比如這個簡單方便的方法:以PLINQ的優勢與自定義可枚舉擴展
public static bool AnyOf<TElement>(this TElement item, IEnumerable<TElement> items)
{
return items.Any(a => EqualityComparer<TElement>.Default.Equals(a, item));
}
現在,這將迫使任何PLINQ查詢返回順序操作即使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的/可枚舉的方法是等效的,即使他們不編譯。
什麼實際問題? – jessehouwing
恩,呃。有點被帶走了:「有沒有什麼方法可以編寫一個LINQ擴展,這個擴展也適用於PLINQ?」。 – Fowl
你所有的擴展方法都很簡短嗎?你有多少人? – svick