我是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]
始终是整个输入字符串,这就是为什么我的代码从索引1
而不是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}" );
如果使用Newtonsoft JSON.NET并将输入更改为JSON:
string dataString = "[{id: 1, desc: "hello", state: 1, res: 3}, {id: 2, desc: "othello", state: 0, res: 2}]"
var dataObject = Newtonsoft.Json.JsonConvert.DeserializeObject<Data>(dataString );
这应该有帮助。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
(...)
public static void Main(string[] args)
{
string input = "{1, 'hello', 1, 3}, {2, 'othello', 0, 2}";
var pattern = "{(.*?)}";
var matches = Regex.Matches(input, pattern);
var separated = matches
.Select(m => m.Groups[1].ToString())
.ToList();
var os = new Program().CreateInstances(separated).ToList();
}
IEnumerable<Data> CreateInstances(IEnumerable<string> separated)
=> separated.Select(o =>
{
var parts = o.Split(',').Select(s => s.Trim()).ToList();
return new Data(
int.Parse(parts[0]),
parts[1].Trim('\''),
int.Parse(parts[2]),
int.Parse(parts[3]));
});