如何在C#中将逗号分隔字符串转换为自定义类实例
高效解析字符串到自定义类实例
我需要把一段特定格式的字符串转换为自定义Data类的实例,类定义如下:
public class Data { public string Event {get;set;} public string TagId {get;set;} public string Type {get;set;} public string Frequency {get;set;} public string Rssi {get;set;} public string TxPower {get;set;} public string Tid {get;set;} }
待解析的字符串示例:
event.tag.report tag_id=0x534D43010005600803251100, type=ISOC, antenna=1, frequency=919000, rssi=-451, tx_power=280, tid=0xE2003412012DF30009DA43851F0E0074300541FBFFFFDC50
我原本的思路是通过逗号分割字符串,再按等号分割取值后赋值,但这种方法不仅依赖字段顺序,还存在明显逻辑错误(比如开头的Event字段未正确提取)。以下是我的尝试代码:
private void ParseIntoDataClass (string eventInfo) { var firstArray = eventInfo.Split(','); var secondArray = new List<string>(); var data = new Data(); foreach (var item in firstArray) { secondArray.Add(item.Split('=').Last()); } for (int i = 0; i < secondArray.Count - 1; i++) { switch(i) { case 0: data.Event = secondArray[i]; break; case 1: data.TagId = secondArray[i]; break; case 2: data.Type = secondArray[i]; break; case 3: data.Frequency = secondArray[i]; break; case 4: data.Rssi = secondArray[i]; break; case 5: data.TxPower = secondArray[i]; break; case 6: data.Tid = secondArray[i]; break; } } }
更高效且可靠的实现方法
方法一:手动分割键值对(性能最优)
这种方法不依赖字段顺序,能正确提取所有字段,同时处理字符串中的多余空格,鲁棒性更强:
private Data ParseIntoDataClass(string eventInfo) { var data = new Data(); // 提取开头的Event名称 var firstSpacePos = eventInfo.IndexOf(' '); if (firstSpacePos > 0) { data.Event = eventInfo.Substring(0, firstSpacePos); // 截取键值对部分 var keyValueSection = eventInfo.Substring(firstSpacePos + 1); // 分割所有键值对,同时去除首尾空格 var keyValuePairs = keyValueSection.Split(new[] { ',' }, StringSplitOptions.TrimEntries); foreach (var pair in keyValuePairs) { var keyValue = pair.Split('='); if (keyValue.Length != 2) continue; var key = keyValue[0].Trim(); var value = keyValue[1].Trim(); // 根据键名直接赋值,不依赖顺序 switch (key) { case "tag_id": data.TagId = value; break; case "type": data.Type = value; break; case "frequency": data.Frequency = value; break; case "rssi": data.Rssi = value; break; case "tx_power": data.TxPower = value; break; case "tid": data.Tid = value; break; // 忽略不需要的字段(比如antenna) } } } return data; }
方法二:正则表达式解析(代码更简洁)
如果字符串格式复杂,用正则可以一次性匹配所有键值对,代码更简洁:
using System.Text.RegularExpressions; private Data ParseIntoDataClass(string eventInfo) { var data = new Data(); // 匹配开头的Event名称 var eventMatch = Regex.Match(eventInfo, @"^(\S+)"); if (eventMatch.Success) { data.Event = eventMatch.Groups[1].Value; } // 匹配所有key=value格式的内容 var keyValueMatches = Regex.Matches(eventInfo, @"(\w+)=([^,]+)"); foreach (Match match in keyValueMatches) { var key = match.Groups[1].Value; var value = match.Groups[2].Value.Trim(); switch (key) { case "tag_id": data.TagId = value; break; case "type": data.Type = value; break; case "frequency": data.Frequency = value; break; case "rssi": data.Rssi = value; break; case "tx_power": data.TxPower = value; break; case "tid": data.Tid = value; break; } } return data; }
优化点说明
- 修复原代码逻辑错误:正确提取开头的
Event字段,原代码错误地将tag_id的值赋值给了Event - 不依赖字段顺序:通过键名匹配赋值,即使输入字符串的字段顺序变动,也不会影响结果
- 鲁棒性提升:处理字符串中的多余空格,跳过格式不正确的键值对
- 性能优化:避免不必要的列表存储,直接遍历赋值,减少内存开销
内容的提问来源于stack exchange,提问作者Ibanez1408
相关产品推荐
相关产品推荐

