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