Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将字符串拆分为对象列表_C#_String_Split - Fatal编程技术网

C# 将字符串拆分为对象列表

C# 将字符串拆分为对象列表,c#,string,split,C#,String,Split,我的意见如下: "10+18+12+13" "10+18-12+13" "2-5" e、 g.数字后跟一个“+”或“-” 我创建了类MathOper public class MathOper { public int Num { get; set; } public string Oper { get; set; } //this display the number will be operated. } 我想返回MathOper的列表,如下所示 “10+18-12

我的意见如下:

"10+18+12+13" 
"10+18-12+13" 
"2-5"
e、 g.数字后跟一个
“+”
“-”

我创建了类
MathOper

public class MathOper
{ 
    public int Num { get; set; }
    public string Oper { get; set; } //this display the number will be operated.
}
我想返回MathOper的列表,如下所示
“10+18-12+13”
将返回

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;
    }
}
公共类MathOperCreator
{
私有只读字符串_mathString;//8+2-3
公共MathOperCreator(字符串mathString)
{
这是._mathString=mathString.Trim();
}
公共列表创建()
{
var lMo=新列表();
int l=this.\u mathString.Length;//5
对于(int i=0;i0)
{
o1=_mathString[i-1].ToString(CultureInfo.InvariantCulture);
}
var mo=new MathOper{Num=n1,Oper=o1};
添加(mo);
}
返回lMo;
}
}
我发现它只适用于带有一个字符的数字,如果数字是两个字符,比如18,它就不起作用。
请建议如何实现所描述的功能?

试试这个,我认为它是按照您想要的方式工作的:(易于理解的解决方案,但不是最优的)

公共类数学运算器
{
公共int Num{get;set;}
公共字符串Oper{get;set;}//此显示将对数字进行操作。
}
公共类MathOperCreator
{
公共只读字符串_mathString;//8+2-3
公共MathOperCreator(字符串mathString)
{
这是._mathString=mathString.Trim();
}
公共列表创建()
{
var lMo=新列表();
int l=this.\u mathString.Length;//5
字符串mathStringTemp;
char[]charArr=_mathString.ToCharArray();
if(charArr[0]!='+'| | charArr[0]!='-')
{
_mathStringTemp=“+”+\u mathString;
}否则
{
_mathStringTemp=\u mathString;
}
char[]delimitersNumb=新字符[]{'+','-'};
字符串[]数字=_mathStringTemp.Split(delimitersNumb,
StringSplitOptions.RemoveEmptyEntries);
字符串[]运算符=新字符串[numbers.Length];
整数计数=0;
foreach(字符c在mathStringTemp中)
{
如果(c=='+'| | c=='-')
{
运算符[count]=c.ToString();
计数++;
}
}
for(int i=0;i
这对我很有用

        //you can change in to MathOper
        List<Tuple<int, char>> result = new List<Tuple<int, char>>(); 
        string _mathString = "2-2+10-13"; //Test
        char sign = '-';
        if (_mathString[0] != '-') //checking the first sign
        {
            sign = '+';
        }
        while (_mathString.Length > 0)
        {
            int nextPl = _mathString.IndexOf('+');
            int nextMn = _mathString.IndexOf('-');

            if (nextPl == -1 && nextMn == -1) //condition when _mathString contains only number
            {
                result.Add(new Tuple<int, char>(int.Parse(_mathString), sign));
                break;
            }
            else
            {
                //getting the end position of first number
                int end = nextPl == -1 ? nextMn : (nextMn == -1 ? nextPl : (Math.Min(nextPl, nextMn)));

                //retrieving first number
                result.Add(new Tuple<int, char>(int.Parse(_mathString.Substring(0, end)), sign));
                _mathString = _mathString.Remove(0, end);

                //retrieving next sign
                sign = _mathString[0];
                _mathString = _mathString.Remove(0, 1);
            }
        }
//您可以更改为MathOper
列表结果=新列表();
字符串_mathString=“2-2+10-13”//试验
字符符号='-';
if(_mathString[0]!='-')//检查第一个符号
{
符号='+';
}
而(_mathString.Length>0)
{
int nextPl=_mathString.IndexOf('+');
int nextMn=_mathString.IndexOf('-');
if(nextPl=-1&&nextMn==-1)//当\u mathString只包含数字时的条件
{
Add(新元组(int.Parse(_mathString),sign));
打破
}
其他的
{
//获取第一个数字的结束位置
int end=nextPl==-1?nextMn:(nextMn==-1?nextPl:(Math.Min(nextPl,nextMn));
//检索第一个号码
添加(新元组(int.Parse(_mathString.Substring(0,end)),符号));
_mathString=\u mathString.Remove(0,结束);
//检索下一个标志
符号=_数学字符串[0];
_mathString=\u mathString.Remove(0,1);
}
}

这是一个经过测试的解决方案

//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);
}
如果你不想要一个空值,那么总是a+

mathOperation.Operation = (i>GetOperators.Length)? GetOperators[i] : "+";
然后这将给出一个如下列表

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

您应该改为尝试或使用其他现有的表达式解析器。。。或者,如果您试图自己编写一个,首先将字符串分隔为标记(如数字序列作为单个标记)…根据问题,您的输出列表是不正确的,因为它应该创建一个包含以下对象的列表<代码>{(10'+),(18'+),(12'-),(13'+)
对于这个字符串
10+18-12+13
@Tafari修改了答案:)
{Num=10,"+"}
{Num=18,"+"}
{Num=12,"-"}
{Num=13,"+"} //as in my test string there is no char after 13