好的,我有一个像这样的传入文本块...(在串行流或富文本框中) 要温柔 - 只有C#的第3天
由LF
分隔的约50行LASTKNOWN:041A
INVERT:041E
INCOUNT:0422
INZERO:042A
OUTCOUNT:0434
OUTZERO:043C
我粗略的初学者尝试一次解析这一行...是找到关键字(例如LASTKNOWN),并将其(按字面意思)推入列表,然后挖出尾随值并将其推入第二个同步的整数列表。 进入同步的Int16列表
(当然我希望这可以在列表中使用结构更优雅 - 我还没有达到目的!)
index = rtbReceived.Find("LASTKNOWN");
if (index > 0)
{ // assign the value from the string into the local variable lists
fieldName.Add("LASTKNOWN");
fieldValue.Add(<theValue>);
}
必须有一种更好的方法来迭代地执行此操作 ...使用可变长度的关键字/值等。
帮助表示赞赏。
答案 0 :(得分:1)
正如评论中提到的那样,您可以使用拆分组合。您还可以使用此正则表达式方法将keyvaluepairs放入字典中。
string sInput = @"LASTKNOWN:041A
INVERT:041E
INCOUNT:0422
INZERO:042A
OUTCOUNT:0434
OUTZERO:043C";
Regex r = new Regex(@"^(?<key>[^:]+):(?<val>.+)$", RegexOptions.Multiline);
MatchCollection matches = r.Matches(sInput);
Dictionary<String, String> lst = new Dictionary<string, string>();
foreach (Match m in matches)
{
lst.Add(m.Groups["key"].Value, m.Groups["val"].Value);
}
使用Dictionary唯一要记住的是你不能拥有重复的密钥。一旦你在字典中获得它,它就不像一个由字符串索引的数组。以下是一些如何使用它的示例:
foreach (KeyValuePair<String, String> item in lst)
{
string sKey = item.Key;
string sValue = item.Value;
}
string sLastKnownValue = lst["LASTKNOWN"];
如果您只是寻找一个,您可以绕过迭代:
string sInput = @"LASTKNOWN:041A
INVERT:041E
INCOUNT:0422
INZERO:042A
OUTCOUNT:0434
OUTZERO:043C";
Regex r = new Regex(@"^LASTKNOWN:(?<val>.+)$", RegexOptions.Multiline);
Match m = r.Match(sInput);
string sValue = String.Empty;
if (m.Success)
sValue = m.Value;