配列を必要とする可変引数関数のための設計上の決定は何でしたか?
-
13-09-2019 - |
質問
私は好奇心旺盛だし、うまくいけば、誰かがこの上somelight当てることができます - ?しかし、なぜ「paramsは」を取るC#の機能を配列する必要があります。
私は、パラメータリスト内のオブジェクトを配列に入力されていることを誰かが配列オブジェクトの未定義の数に取る可変引数関数を作成したい場合はどう取得する?
たとえば、この機能を取る...
private Int32 Sum(params Int32[] numbers)
{
return numbers.Sum(); // Using LINQ here to sum
}
かなりまっすぐ進む、それは数字の異なる量で取ることができます - 例えば...
Int32 x = Sum(1);
Int32 y = Sum(1, 2);
Int32 z = Sum(1, 2, 3);
今、私は整数配列の異なる量にかかり、すべての数字を合計する関数を作成したいと言うことができます。私は承知しています限り、私はボクシングを検討する必要があります...
private Int32 SumArrays(params Object[] numbers)
{
Int32 total = 0;
foreach (Object o in numbers)
{
Int32[] array = (Int32[])o;
total += array.Sum();
}
return total;
}
そして...
のように使用することができましたInt32[] arr1 = new Int32[] { 1, 2, 3 };
Int32[] arr2 = new Int32[] { 1, 2, 3, 4 };
Int32[] arr3 = new Int32[] { 1, 2, 3, 4, 5 };
Int32 x = SumArrays((Object)arr1, (Object)arr2);
Int32 y = SumArrays((Object)arr1, (Object)arr2, (Object)arr3);
この背後にある理由は何でしたか?なぜこれが今までただ単一の非配列変数として実装されていませんでしたか?このようなparams Int32
として?
解決
の機能がすでにあり、ボクシングに頼る必要はありません。
private int SumAll(params int[][] args)
{
int result = 0;
for (int x = 0; x < args.Length; x++)
{
for (int y = 0; y < args[x].Length; y++)
{
result += args[x][y];
}
}
return result;
}
あなたはそれを配列の配列を追加する必要があります。
他のヒント
paramsは、単一のオブジェクトに圧延取得し、コレクションを保持することができる最も低いレベルのオブジェクトは、アレイです。あなたはint型の配列の可変数を取る関数が必要な場合、それはint型の配列の配列を取るように宣言する必要があります。
static int SumArrays(params int[][] data)
{
int rval = 0;
for (int i = 0; i < data.Length; i++)
{
rval += data[i].Sum();
}
return rval;
}
所属していません StackOverflow