質問したいのですが、列挙型を返すセレクターしかないのはなぜですか? たとえば、次のように、配列の各値を変更する必要がある場合がよくあります。
int[] a = {1,2,3,4,5};
a = a.Select(x=>x*2).ToArray();
したがって、ここでは列挙可能なものを取得し、その後でのみ配列に戻すことができます。ソースを変更できる場合に限り、Array.ForEach の使用を試みることができます。しかし、参照型の配列があり、それらを変更できない場合は、とにかく次のように書く必要があります
SomeClass[] a = FillSomeClassArray();
SomeClass[] b = a.Select(x=> ((SomeClass)x.Clone()).Modify()).ToArray();
私の場合、私は自分のクラスを使用しています
public static class CollectionHelper
{
public static TResult[] SelectToArray<T, TResult>(this ICollection<T> source, Func<T, TResult> selector)
{
if (source == null)
throw new ArgumentNullException("source");
if (selector == null)
throw new ArgumentNullException("selector");
var result = new TResult[source.Count];
int i = 0;
foreach (T t in source)
{
result[i] = selector(t);
i++;
}
return result;
}
}
ここでは、二重変換はありません。述語がない場合は、結果の長さがわかっているので、この情報を使用する必要があります。MSが私の代わりにすべての作業を行うべきではないことはわかっていますが、機能標準としては十分です。