我对 C# 很陌生,需要一些关于如何解决以下问题的建议。
我有以下内容。
string input = "{1, 'hello', 1, 3}, {2, 'othello', 0, 2}"
在某些情况下,{}
输入字符串中可能只有一个或多个。
我希望能够将输入字符串拆分为两个或多个,{}
并创建类 Data 的实例并将每个新实例添加到List<Data> mydatalist()
.
我有以下 Data 类的声明。我不确定如何拆分输入字符串并从中创建 Data 类实例。
public partial class Data
{
private:
int id;
string desc;
int state;
int res;
public:
Data(int idval, string indesc, int instate, int inres)
{
id=idval; desc=indesc; state=instate; res=inres;
}
}
最后,我List<Data> mydatalist()
将包含两个Data
类对象,并相应地声明了各自的字段。
void CreateInstances(string result)
{
var temp = result.Split(); // This gives me every index?
}
任何帮助将不胜感激。
{ <number>, <string>, <number>, <number> }
部分使用正则表达式。"foo*.txt"
您可能已经见过的更强大的通配符或全局搜索形式。
(\d+)
意思是“匹配十进制数字”\s*
意思是“在这里期待可选的空格”'(.*?)'
意思是“将两个引号之间的每个字符读为一个值”Match.NextMatch()
方法和Match.Successful
属性允许相同的正则表达式到超过一个输入字符串多次运行。String
值返回Match.Groups[]
。
Match.Groups[0]
始终是整个输入字符串,这就是为什么我的代码从 index1
而不是0
.String
值,所以您需要使用它们Int32.Parse
或Int32.TryParse
将它们转换为Int32
值。像这样:
class Data
{
public Data( Int32 id, String description, Int32 state, Int32 res )
{
this.Id = id;
this.Description = description;
this.State = state;
this.Res = res;
}
public Int32 Id { get; }
public String Description { get; }
public Int32 State { get; }
public Int32 Res { get; }
}
public static List<Data> ParseData( String input )
{
RegEx r = new Regex( @"\{\s*(\d+)\s*,\s*'(.*?)'\s*,\s*(\d+)\s*,\s*(\d+)\s*\}" );
List<Data> list = new List<Data>();
Match m = r.Match( input );
while( m.Success )
{
Int32 id = Int32.Parse( m.Groups[1].Value, NumberStyles.Integer, CultureInfo.InvariantCulture );
String desc = m.Groups[2].Value;
Int32 state = Int32.Parse( m.Groups[3].Value, NumberStyles.Integer, CultureInfo.InvariantCulture );
Int32 res = Int32.Parse( m.Groups[4].Value, NumberStyles.Integer, CultureInfo.InvariantCulture );
Data d = new Data( id, desc, state, res );
list.Add( d );
m = m.NextMatch();
}
return list;
}
像这样使用:
List<Data> list = ParseData( "{1, 'hello', 1, 3}, {2, 'othello', 0, 2}" );
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句