C#-将由“ =”分隔的键值对的字符串转换为字典

时间:2018-07-02 23:19:16

标签: c# arrays string

我正在从API中提取数据,该API给了我一些JSON信息。但是,其中一个值给我:

{X0=80,X1=80,X2=80,X3=80,X4=80,X5=80,X6=80,X7=80,X8=80,X9=80,X10=80,X11=80,X12=80,X13=80,X14=80,X15=80,X16=80,X17=80,X18=80,X19=80,X20=80,X21=80,X22=80,X23=80,X24=80,X25=80,X26=80,X27=80,X28=80,X29=80,X30=80,X31=80,X32=80,X33=80,X34=80,X35=80,X36=80,X37=80,X38=80,X39=80,X40=80,X41=80,X42=80,X43=80,X44=80,X45=80,X46=80,X47=80,X48=80,X49=80,X50=80,X51=80,X52=80,X53=80,X54=80,X55=80,X56=80,X57=80,X58=80,X59=80,X60=80,X61=80,X62=80}

我正在尝试将其解码以用于C#控制台应用程序(.NET)。 我的主要问题是,将这个字符串提取到字典或数组中的最佳方法是什么?我不确定我的措词是否正确,如果我错了,请纠正我!

谢谢!

3 个答案:

答案 0 :(得分:7)

您可以将 Linq TrimSplitSelectToDictionary

一起使用
var result = json.Trim('{', '}')
                 .Split(',')
                 .Select(x => x.Split('='))
                 .ToDictionary(x => x[0], x => int.Parse(x[1]));

Console.WriteLine(string.Join("\r\n", result.Select(x => x.Key + " : " + x.Value)));

Full Demo Here

仅仅是因为我无聊

基准

Mode             : Release (64Bit)
Test Framework   : .NET Framework 4.7.1

Operating System : Microsoft Windows 10 Pro
Version          : 10.0.17134

CPU Name         : Intel(R) Core(TM) i7-3770K CPU @ 3.50GHz
Description      : Intel64 Family 6 Model 58 Stepping 9

Cores (Threads)  : 4 (8)      : Architecture  : x64
Clock Speed      : 3901 MHz   : Bus Speed     : 100 MHz
L2Cache          : 1 MB       : L3Cache       : 8 MB

Benchmarks Runs : Inputs (1) * Scales (3) * Benchmarks (3) * Runs (100) = 900

结果

--- Random Set ----------------------------------------------------------------------
| Value       |   Average |   Fastest |      Cycles |    Garbage | Test |      Gain |
--- Scale 100 -------------------------------------------------------- Time 0.229 ---
| Split       |  0.058 ms |  0.043 ms |     207,064 |  48.000 KB | Base |    0.00 % |
| JsonReplace |  0.077 ms |  0.064 ms |     273,556 |  24.000 KB | Pass |  -32.38 % |
| Regex       |  0.270 ms |  0.235 ms |     950,504 |  80.000 KB | Pass | -364.87 % |
--- Scale 1,000 ------------------------------------------------------ Time 0.633 ---
| Split       |  0.490 ms |  0.446 ms |   1,718,180 | 495.102 KB | Base |    0.00 % |
| JsonReplace |  0.671 ms |  0.596 ms |   2,352,043 | 195.078 KB | Pass |  -36.86 % |
| Regex       |  2.544 ms |  2.293 ms |   8,897,994 | 731.125 KB | Pass | -419.00 % |
--- Scale 10,000 ----------------------------------------------------- Time 5.005 ---
| Split       |  5.247 ms |  4.673 ms |  18,363,748 |   4.843 MB | Base |    0.00 % |
| JsonReplace |  6.782 ms |  5.488 ms |  23,721,593 |   1.829 MB | Pass |  -29.25 % |
| Regex       | 31.840 ms | 27.008 ms | 111,277,134 |   6.637 MB | Pass | -506.80 % |
-------------------------------------------------------------------------------------

数据

private string GenerateData(int scale)
{
   var ary = Enumerable.Range(0, scale)
                       .Select(x => $"X{x}={Rand.Next()}")
                       .ToList();

   return $"{{{string.Join(",", ary)}}}";
}

拆分

public class Split : Benchmark<string, Dictionary<string,int>>
{
   protected override Dictionary<string,int> InternalRun()
   {
      return Input.Trim('{', '}')
                       .Split(',')
                       .Select(x => x.Split('='))
                       .ToDictionary(x => x[0], x => int.Parse(x[1]));
   }
}

正则表达式

使用Cast

授予 emsimpson92
public class Regex : Benchmark<string, Dictionary<string,int>>
{
   protected override Dictionary<string,int> InternalRun()
   {
      var regex = new System.Text.RegularExpressions.Regex("(?<key>[^,]+)=(?<value>[^,]+)");
      var matchCollection = regex.Matches(Input.Trim('{', '}'));
      return matchCollection.Cast<Match>()
                     .ToDictionary(
                         x => x.Groups["key"].Value,
                         x => int.Parse(x.Groups["value"].Value));
   }
}

JsonReplace

已授予汉扎拉·阿达兰的权限,已修改为可与string.replace

一起使用
public unsafe class JsonReplace : Benchmark<string, Dictionary<string,int>>
{
   protected override Dictionary<string,int> InternalRun()
   {
     return JsonConvert.DeserializeObject<Dictionary<string,int>>(Input.Replace("=", ":"));
   }
}

其他资源

String.Trim Method

  

返回一个新字符串,其中所有前导和尾随出现   当前String对象中的一组指定字符是   删除。

String.Split Method (String[], StringSplitOptions)

  

根据数组中的字符串将字符串拆分为子字符串。您   可以指定子字符串是否包含空数组元素。

Enumerable.Select Method (IEnumerable, Func)

  

将序列的每个元素投影为新形式。

Enumerable.ToDictionary Method (IEnumerable, Func)

  

根据IEnumerable创建字典   指定的按键选择器功能。

答案 1 :(得分:1)

这可以通过Regex完成。以下模式将捕获2个独立组(?<key>[^,]+)=(?<value>[^,]+)中的键和值

Demo

一旦有了MatchCollection,请在其中运行foreach循环,然后将每个元素添加到字典中。

答案 2 :(得分:1)

Var myAwesomeDictionary = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string,string>>(_yourJsonStringHere);
相关问题