あなたの質問に対する私の理解は、Rad2Deg
署名と戻り値の型がFunc<double, double>
.
私はそれを行うのに特に良い方法は見当たりません。最高のものはおそらく次のとおりです。
internal PointGeospatial ConvertToSpherical(double x, double y, double z)
{
var changedArgs = new[] { x, y, z, }.Select(Rad2Deg).ToArray();
// rest of method
}
ただし、元の変数は変更されないため、偶然にもx
,y
を引き続き使用できます。z
メソッドのシグネチャを配列を取るように変更した場合 ( をparams
使用するため、同じ呼び出し構文で呼び出すことができます)、次のことができます。
internal PointGeospatial ConvertToSpherical(params double[] x)
{
for (int i = 0; i < x.Length; ++i)
x[i] = Rad2Deg(x[i]);
// rest of method
}
最後のケースを矢印で行うこともできますが、少し醜いです。あなたはこれを必要とします:
namespace N
{
delegate void ActionWithRef<T>(ref T obj);
static class MyExtensions
{
public static void ForEachWithRef<T>(this T[] array, ActionWithRef<T> action)
{
for (int i = 0; i < array.Length; ++i)
action(ref array[i]);
}
}
}
次に、次のことができます。
// ugly?
// included in this post because it looks a bit like the pseudocode of your question
internal PointGeospatial ConvertToSpherical(params double[] x)
{
x.ForEachWithRef((ref double t) => t = Rad2Deg(t));
// rest of method
}
おそらく、持っているほうが少し醜いです:
namespace N
{
static class MyExtensions
{
public static void MutateAll<T>(this T[] array, Func<T, T> selector)
{
for (int i = 0; i < array.Length; ++i)
array[i] = selector(array[i]);
}
}
}
と一緒に使用します:
internal PointGeospatial ConvertToSpherical(params double[] x)
{
x.MutateAll(Rad2Deg);
// rest of method
}
パラメーターが 3 つしかない場合にこれらの「ソリューション」を実際に推奨するとは言いませんが、C# でできること (およびできないこと) を示しています。
私が を使用するすべての場合params
において、 の呼び出し元ConvertToSpherical
が展開されていない形式でメソッドを呼び出すことを選択し、double[]
渡したインスタンスへの参照を保持している場合、メソッドが戻ったときに配列の内容が変更されていることに気付くでしょう。
また、params
例では、もちろん、渡される引数の数 (正確に 3 つかどうか) はコンパイル時にチェックされません。
反復的で機能しないソリューションは次のとおりです。
internal PointGeospatial ConvertToSpherical(double x, double y, double z)
{
x = Rad2Deg(x);
y = Rad2Deg(y);
z = Rad2Deg(z);
// rest of method
}
;-)