2009-07-14 6 views
3

私は興味がありますし、うまくいけば誰かがこれを体現することができます - しかし、なぜ '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); 

は、今、私がしたいと言うことができます異なる量のInteger配列を取り、すべての数を合計する関数を作成します。私の知る限り承知していますように私はボクシングを検討する必要があります...

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など?

答えて

3

機能がすでにあり、ボクシングに頼る必要はありません:

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; 
} 

あなたはちょうどそれを配列の配列を追加する必要があります。

+0

実際に配列の配列ではないので、ああクールdidntはそれを知っていますが、なぜこの場合ですか?配列のリストだけです。なぜなら、数値のリストをInt32で解析するのではなく、配列を調べるのにInt32 []を使うのはなぜですか? –

+1

@Chalkey:はいそれは配列の配列です。デバッガでargsを調べると、args = {int [2] []}のようになります。 args配列の各要素はint配列です。 –

0

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; 
} 
+2

完全LINQソリューションを使用できる場合は、なぜ、半LINQソリューションを使用するのですか? 'return data.Sum(array => array.Sum());'。 –

関連する問題