0

次のような入力があります。

"10+18+12+13" 
"10+18-12+13" 
"2-5"

例: number の後に a"+"または"-"
I created クラスMathOper

public class MathOper
{ 
    public int Num { get; set; }
    public string Oper { get; set; } //this display the number will be operated.
}

"10+18-12+13"以下が返されるので、MathOperのリストを返したい

new MathOper(){Num=10,"+"}
new MathOper(){Num=18,"+"}
new MathOper(){Num=12,"-"}
new MathOper(){Num=13,"+"}

私はこの方法でそれをコーディングしようとしました:

public class MathOperCreator
{
    private readonly string _mathString;//8+2-3
    public MathOperCreator(string mathString)
    {
        this._mathString = mathString.Trim();
    }
    public List<MathOper> Create()
    {
        var lMo = new List<MathOper>();
        int l = this._mathString.Length;//5
        for (int i = 0; i < l; i = i + 2)
        {
            char n = _mathString[i];
            int n1 = int.Parse(n.ToString(CultureInfo.InvariantCulture)); 
            string o1 = "+";
            if (i > 0)
            {
                o1 = _mathString[i - 1].ToString(CultureInfo.InvariantCulture);
            }

            var mo = new MathOper { Num = n1, Oper = o1 };
            lMo.Add(mo);
        }
        return lMo;
    }
}

数字が 18 などの 2 文字の場合、1 文字の数字のみであることがわかりました。説明されている機能を実装する方法についてアドバイスをお願いします。

4

3 に答える 3

2

これはテスト済みのソリューションです

//Model class
public class MathOperation
{
    public Int32 Num { get; set; }
    public String Operation { get; set; }
}

   String testData = "10+18+12-13";
   String[] GetNumbers = testData.Split(new Char[] { '+', '-' });
   String[] GetOperators = Regex.Split(testData, "[0-9]+");

   //remove empty entries in operator
   GetOperators = GetOperators.Where(x => !string.IsNullOrEmpty(x)).ToArray();

   List<MathOperation> list = new List<MathOperation>();
   MathOperation mathOperation = new MathOperation();
    for (int i = 0; i < GetNumbers.Count(); i++)
{
       mathOperation.Num = Convert.ToInt32(GetNumbers[i]);               
       mathOperation.Operation = (i>GetOperators.Length)? GetOperators[i] : null;
       list.Add(mathOperation);
}

これは次のようなリストを提供します

{Num=10,"+"}
{Num=18,"+"}
{Num=12,"-"}
{Num=13,"null"} //as in my test string there is no char after 13

null を常に + にしたくない場合は、

mathOperation.Operation = (i>GetOperators.Length)? GetOperators[i] : "+";

次に、これは次のようなリストを提供します

{Num=10,"+"}
{Num=18,"+"}
{Num=12,"-"}
{Num=13,"+"} //as in my test string there is no char after 13
于 2013-10-18T06:56:27.180 に答える
0

これを試してみてください。あなたが望むように動作すると思います: (解決策を理解するのは簡単ですが、最適ではありません)

public class MathOper
    {
        public int Num { get; set; }
        public string Oper { get; set; } //this display the number will be operated.
    }

    public class MathOperCreator
    {
        public readonly string _mathString;//8+2-3

        public MathOperCreator(string mathString)
        {
            this._mathString = mathString.Trim();
        }
        public List<MathOper> Create()
        {
            var lMo = new List<MathOper>();
            int l = this._mathString.Length;//5
            string _mathStringTemp;

            char[] charArr = _mathString.ToCharArray();

            if (charArr[0] != '+' || charArr[0] != '-')
            {
                _mathStringTemp = "+"+_mathString;
            }               else
            {
                _mathStringTemp = _mathString;
            }

            char[] delimitersNumb = new char[] { '+', '-' };
            string[] numbers = _mathStringTemp.Split(delimitersNumb,
                     StringSplitOptions.RemoveEmptyEntries);


            string[] operators = new string[numbers.Length];
            int count = 0;

            foreach (char c in _mathStringTemp)
            {
                if (c == '+' || c == '-')
                {
                    operators[count] = c.ToString();            
                    count++;
                }
            }

            for(int i=0; i < numbers.Length; i++)
            {

                lMo.Add(new MathOper(){Num = int.Parse(numbers[i]), Oper = operators[i]});
                Console.WriteLine(operators[i]+" "+numbers[i]);
            }

            return lMo;
        }
    }
于 2013-10-18T06:25:30.383 に答える