C#将值列表分解为两个字段

时间:2016-12-18 06:09:09

标签: c# parsing

好的,我有一个像这样的传入文本块...(在串行流或富文本框中) 要温柔 - 只有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>);
}

必须有一种更好的方法来迭代地执行此操作 ...使用可变长度的关键字/值等。

帮助表示赞赏。

1 个答案:

答案 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;