C# 解析字符串并拆分它的最安全方法

C# 解析字符串并拆分它的最安全方法,c#,C#,我有一个字符串是这样的: UNIQUE_ID-String-TriggerID 82-DEFAULT-4;MINIMODE_ARCADE-1;MINIMODE_RUNNER-4;47-STARLING-1; 一些输入示例: 1) 82-Mode1-4; 2) 4-Arcade-2;9-Runner-2;90-STARLING-1; // here you see Unique ID 4 has two entries 3) 82-DEFAULT-4;MINIMODE_ARCADE-1;M

我有一个字符串是这样的:

UNIQUE_ID-String-TriggerID
82-DEFAULT-4;MINIMODE_ARCADE-1;MINIMODE_RUNNER-4;47-STARLING-1; 
一些输入示例:

1) 82-Mode1-4;
2) 4-Arcade-2;9-Runner-2;90-STARLING-1;  // here you see Unique ID 4 has two entries 
3) 82-DEFAULT-4;MINIMODE_ARCADE-1;MINIMODE_RUNNER-4;47-STARLING-1; 2-DEFAULT-4;MINIMODE_ARCADE-0; 
// here 82 UNIQUE ID and 2 UNIQUE ID has two enteritis, but 47 UNIQUE ID has just one enterey
问题是,有时我只能为UniqueID47获取一个条目,有时我为ID82获取多个条目

如何正确拆分和解析字符串

我将解析后的字符串放入字典中,因此有时会添加相同的键,这会引发异常

我已完成以下操作,但仍无法跟踪所有情况:

        String data = Encoding.UTF8.GetString(Convert.FromBase64String(Progress));

        String[] progressEntries = data.Split(';');

        for (int i = 0; i < progressEntries.Length; i++)
        {
            String entry = progressEntries[i];
            String[] values = entry.Split('-');

            if (values.Length > 2)
            {
                Dictionary<string, int> dict = new Dictionary<string, int>();
                dict[values[1]] = Convert.ToInt32(values[2]);
                Progress.Add(Convert.ToInt32(values[0]), dict);
            }
        }
    } 
String data=Encoding.UTF8.GetString(Convert.FromBase64String(Progress));
字符串[]progressEntries=data.Split(“;”);
for(int i=0;i2)
{
Dictionary dict=新字典();
dict[values[1]=Convert.ToInt32(values[2]);
Progress.Add(转换为32(值[0]),dict);
}
}
} 

这不太清楚,但让我们试一试。 在您提供的文本中:

82-DEFAULT-4;MINIMODE_ARCADE-1;MINIMODE_RUNNER-4;47-STARLING-1; 
您有两个组。每个组都有键值对

  • 第1组-关键字:82
    • 默认值:4
    • 迷你拱廊:1
    • 最小模式:4
  • 第2组-关键字:47
    • 椋鸟:1
如果这是您想要获得的结构,那么一种存储可能是
字典

我认为以下代码可以:

public class Parser
{
    public Dictionary<int, Dictionary<string, int>> Parse(string input)
    {
        Dictionary<int, Dictionary<string, int>> data = new Dictionary<int, Dictionary<string, int>>();

        int? currentGroupKey = null;
        string[] keyValuePairs = input.Split(new char[] { ';' });
        foreach (var kvp in keyValuePairs)
        {
            string[] tokens = kvp.Split(new char[] { '-' });
            switch (tokens.Length)
            {
                case 2:
                    {
                        if (currentGroupKey.HasValue)
                        {
                            int groupKey = currentGroupKey.Value;
                            AddKeyValuePair(data, groupKey, tokens[0], tokens[1]);
                        }
                        break;
                    }
                case 3:
                    {
                        int groupKey;
                        if (int.TryParse(tokens[0], out groupKey))
                        {
                            currentGroupKey = groupKey;
                            AddKeyValuePair(data, groupKey, tokens[1], tokens[2]);
                        }
                        break;
                    }
                default:
                    break;
            }

        }
        return data;
    }

    private void AddKeyValuePair(Dictionary<int, Dictionary<string, int>> data, int groupKey, string key, string val)
    {
        Dictionary<string, int> group;
        if (data.ContainsKey(groupKey))
        {
            group = data[groupKey];
        }
        else
        {
            group = new Dictionary<string, int>();
            data[groupKey] = group;
        }

        int intVal;
        if (int.TryParse(val, out intVal))
            group.Add(key, intVal);
    }
}
公共类解析器
{
公共字典解析(字符串输入)
{
字典数据=新字典();
int?currentGroupKey=null;
string[]keyValuePairs=input.Split(新字符[]{';'});
foreach(keyValuePairs中的var kvp)
{
string[]tokens=kvp.Split(新字符[]{'-});
开关(令牌.长度)
{
案例2:
{
if(currentGroupKey.HasValue)
{
int groupKey=currentGroupKey.Value;
AddKeyValuePair(数据、组密钥、令牌[0],令牌[1]);
}
打破
}
案例3:
{
int-groupKey;
if(int.TryParse(令牌[0],out-groupKey))
{
currentGroupKey=groupKey;
AddKeyValuePair(数据、组密钥、令牌[1],令牌[2]);
}
打破
}
违约:
打破
}
}
返回数据;
}
私有void AddKeyValuePair(字典数据、int-groupKey、字符串键、字符串值)
{
词典组;
if(data.ContainsKey(groupKey))
{
组=数据[groupKey];
}
其他的
{
组=新字典();
数据[groupKey]=组;
}
int intVal;
if(内锥巴色(val,外锥巴色))
添加组(key,intVal);
}
}

请提供一些输入和预期输出的其他示例。@HABO我已对其进行了编辑。如果键可能重复,您必须使用其他集合。类似列表的东西也许你应该更好地解释一下解析。不仅仅是“有两个条目”,而是哪两个条目。现在注释和示例似乎不匹配。在示例代码中,您正在创建不会引发该异常的新词典。异常可能发生在
进程中。添加
。我们能看到那个密码吗?(或者指向发生异常的那一行)不客气。下次尝试可视化数据并更好地解释您的问题。哦,等等。。。那你就可以自己解决这个问题了@B-Andrew,c#系列中的压力和经验不足:(