1

私はこのコードを持っています:

BigInteger lhs = new BigInteger(0);
BigInteger rhs = new BigInteger(0);

bool isLeftHandSide = true;

for (int i = 0; i < txtResult.Text.Length; i++)
{
    char currentCharacter = txtResult.Text[i];

    if (char.IsNumber(currentCharacter))
    {
        char currentCharacter = txtResult.Text[i];

        if (isLeftHandSide)
        {
            lhs += (int)char.GetNumericValue(currentCharacter);
        }
        else
        {
            rhs += (int)char.GetNumericValue(currentCharacter);
        }
    }
}

代わりに現在の側への参照を格納して、代わりにその変数を操作し、ifおよびelseステートメントを削除する方法があるかどうか疑問に思いました。安全でないコードコンテキストを使用せずにこれを実行できるようにしたいと思います。

これを置き換えるようなもの:

if (isLeftHandSide)
{
    lhs += (int)char.GetNumericValue(currentCharacter);
}
else
{
    rhs += (int)char.GetNumericValue(currentCharacter);
}

これとともに:

currentSide += (int)char.GetNumericValue(currentCharacter);

ここで、currentSideはlhsまたはrhsのいずれかへの参照です。それらは構造体であるため、データをコピーするだけでなく、それへの参照を保持する方法がわかりません。

ありがとう。

4

4 に答える 4

3

必要なのは、間接層を追加するためのラッパークラスだけです。(このクラスは時々便利だと思います。ユーティリティクラスとして保管しています。)

public class Wrapper<T>
{
    public T Value { get; set; }
}

次にそれを使用するには:

BigInteger lhs = new BigInteger(0);
BigInteger rhs = new BigInteger(0);
Wrapper<BigInteger> currentSide = new Wrapper<BigInteger>();

currentSide.Value = lhs;

for (int i = 0; i < txtResult.Text.Length; i++)
{
    char currentCharacter = txtResult.Text[i];

    if (char.IsNumber(currentCharacter))
    {
        currentSide.Value += (int)char.GetNumericValue(currentCharacter);
    }
}
于 2012-10-11T19:30:47.823 に答える
1

完全に削除することはできませんifが、ループから引き出すことはできます。

bool isLeftHandSide = true;

if (isLeftHandSide)
   lhs = NewMethod(lhs, txtResult.Text);
else
   rhs = NewMethod(rhs, txtResult.Text);
于 2012-10-11T19:14:08.277 に答える
1

必要な変数をラムダでキャプチャできます。次のようになります。

Action<int> addToCurrentSide;

BigInteger lhs = new BigInteger(0);
BigInteger rhs = new BigInteger(0);

addToCurrentSide = x => lhs += x;

for (int i = 0; i < txtResult.Text.Length; i++)
{
    char currentCharacter = txtResult.Text[i];

    if (char.IsNumber(currentCharacter))
    {
        char currentCharacter = txtResult.Text[i];

        addToCurrentSide((int)char.GetNumericValue(currentCharacter));
    }
}

次に、サイドを切り替えるには、次のように再割り当てaddToCurrentSideします。

addToCurrentSide = x => rhs += x;
于 2012-10-11T19:14:50.587 に答える
1

出来るよ、

var isLeftHandSide = true;
var currentSide = new BigInteger(0);

for (int i = 0; i < txtResult.Text.Length; i++)
{
    char currentCharacter = txtResult.Text[i];
    if (char.IsNumber(currentCharacter))
        currentSide += (int)char.GetNumericValue(currentCharacter);
}

if (isLeftHandSide)
    // lhs = currentSide;
else
    // rhs = currentSide;
于 2012-10-11T19:19:50.837 に答える