You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;
}

优化点说明

  1. 修复原代码逻辑错误:正确提取开头的Event字段,原代码错误地将tag_id的值赋值给了Event
  2. 不依赖字段顺序:通过键名匹配赋值,即使输入字符串的字段顺序变动,也不会影响结果
  3. 鲁棒性提升:处理字符串中的多余空格,跳过格式不正确的键值对
  4. 性能优化:避免不必要的列表存储,直接遍历赋值,减少内存开销

内容的提问来源于stack exchange,提问作者Ibanez1408

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 18:15:11