-1

配列ではない5 つの int があるとしましょう! そして、それらすべてを1つのループで変更したい。これらの 5 つの数値の値を取得し、それらを直接変更できる配列を作成する方法はありますか?

何かのようなもの:

int a = 10;
int b = 20;

int[] rihanna = // .... ? 

for(int a=0; a<rihanna.length;a++)
    rihanna[a]++;

Console.WriteLine("{0} {1} ",a,b) // what I want to see here is 11 and 21
4

4 に答える 4

4

要件を緩和すれば、それを解決する方法があると思いますint。配列に対する操作を介してローカル変数のセットを変更できるエンティティの配列があります。

そうすることで、それぞれが取るデリゲートの配列内の変数への参照をキャプチャすることができますref int val

void Increase(ref int x) 
{
    x++;
}
void Set(ref int x, int amount) 
{
    x = amount;
}

void Sample()
{
  int a = 10;
  int b = 20;

  // Array of "increase variable" delegates
  var increaseElements = new Action[] { 
    () =>  Increase(ref a), 
    () =>  Increase(ref b) 
  };
  increaseElements[0](); // call delegate, unfortunately () instead of ++ 
  Console.WriteLine(a); // writes 11

  // And now with array of "set the variable" delegates:
  var setElements = new Action<int>[] { 
    v =>  Set(ref a,v), 
    v =>  Set(ref b,v) 
  };
  setElements[0](3); 
  Console.WriteLine(a); // writes 3 
}

ノート

  • デリゲートを直接使用するには、()を使用してそれらを呼び出す必要があります。
  • 実装としてIncreaseを呼び出すオブジェクトにデリゲートをラップすることで、問題()の代わりに修正できる場合があります。++++
  • 代わりにSet呼び出す必要があるバージョンの問題は、より巧妙な作業が必要になります-保存されたセッター関数を呼び出すようにリダイレクトするために、インデックス付きのカスタムクラスを実装します。(3)= 3set [index]

警告:これは実際には娯楽目的で行われます。実際のコードで試さないでください。

于 2013-03-15T04:19:04.457 に答える
4

一般に、ここでの答えはノーです。これには、C# で整数 (またはその他の値型) への参照を許可する必要がありますが、そうではありません(正当な理由により)。

私が思い付くことができる最善の解決策は、refパラメーターを指定して関数を使用することです。とにかく、一連の任意の整数変数を操作しようとしているので、それらをすべてリストする必要があります。次のように、関数呼び出しでそれを行うのはどうですか:

void Increase(ref int x) {
    x++;
}

int a = 10;
int b = 20;

Increase(ref a);
Increase(ref b);
于 2013-03-15T04:16:27.153 に答える
4

その前に、次の言葉を述べたいと思います。これはあなたが望むことをしますが..それはかなり醜いです。これは、実際にははるかに難しいのに、C# で「ただできる」と想定していたこととより一致しています。

unsafe {
    int* a = stackalloc int[1];
    int* b = stackalloc int[1];

    *a = 10;
    *b = 20;

    int*[] rihanna = { a, b };

    for (int i = 0; i < rihanna.Length; i++) {
        (*rihanna[i])++;
    }

    Console.WriteLine("{0} {1} ", *a, *b); // "11 21"
}
于 2013-03-15T04:17:34.567 に答える
2

.NETでは実際にこれを行うことはできません。intsは値型であるため、それらを直接参照することはできません。

ただし、これを回避する方法はいくつかあります。これが1つだけです:

class IntReference
{
    int Value { get; set; }
}

IntReference a = new IntReference() { Value = 10 };
IntReference b = new IntReference() { Value = 20 };

IntReference[] rihanna = { a, b };

for (int i = 0; i < rihanna.Length; i++)
    rihanna[i].Value = rihanna[i].Value + 1;

Console.WriteLine("{0} {1} ", a.Value, b.Value); // "11 21"

あなたは本当にこれをする必要はないはずですが、これまでに。これは、.NETの値型の設計に反します。

于 2013-03-15T04:19:22.367 に答える