如何将字符串数组转换为数组

3
我有一个字符串:["gm-63.pdf","GM413.pdf","mh524.pdf"],如何使用C#将其转换为字符串数组?

查找 string.SplitTrim 问题解决,同时使用 Select - TheGeneral
但它包含 [ ]" 字符。 - P. Pogba
可能是如何使用C#解析JSON?的重复问题。 - Patrick Roberts
2个回答

8
可能有很多方法可以实现这个目标。 选项1
var input = @"[""gm-63.pdf"",""GM413.pdf"",""mh524.pdf""]";
var result = input.Trim('[', ']')
                  .Split(",")
                  .Select(x => x.Trim('"'))
                  .ToArray();

点击此处查看 .Net 4.5 演示

更新

Windows 禁用的文件名字符:

< (less than)
> (greater than)
: (colon - sometimes works, but is actually NTFS Alternate Data Streams)
" (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)

如果这些是有效的文件名,您不应该在双引号上遇到问题,但逗号可能会成为问题。

因此,请小心使用。

选项2

您还可以使用Json.Net包。 相关文档在此处

return JsonConvert.DeserializeObject<string[]>(Input);

基准测试

只是因为我无聊了,打开了我的基准测试器。

所有的测试都进行了垃圾回收,并且结果按操作进行了缩放。

----------------------------------------------------------------------------
Mode             : Release (64Bit)
Test Framework   : .NET Framework 4.7.1 (CLR 4.0.30319.42000)
----------------------------------------------------------------------------
Operating System : Microsoft Windows 10 Pro
Version          : 10.0.17134
----------------------------------------------------------------------------
CPU Name         : Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz
Description      : Intel64 Family 6 Model 42 Stepping 7
Cores (Threads)  : 4 (8)      : Architecture  : x64
Clock Speed      : 3401 MHz   : Bus Speed     : 100 MHz
L2Cache          : 1 MB       : L3Cache       : 8 MB
----------------------------------------------------------------------------

测试1

--- Standard input ---------------------------------------------------------
| Value |    Average |    Fastest |   Cycles |   Garbage | Test |     Gain |
--- Scale 10 ------------------------------------------------ Time 0.257 ---
| Split | 519.472 ns | 390.200 ns |  2.063 K | 811.776 B | Base |   0.00 % |
| Json  | 914.331 ns | 810.500 ns |  3.419 K | 819.200 B | N/A  | -76.01 % |
--- Scale 100 ----------------------------------------------- Time 0.061 ---
| Split | 216.935 ns | 141.090 ns | 769.172  | 327.680 B | Base |   0.00 % |
| Json  | 326.246 ns | 237.150 ns |  1.147 K | 163.840 B | N/A  | -50.39 % |
--- Scale 1,000 --------------------------------------------- Time 0.101 ---
| Split | 126.233 ns | 112.272 ns | 433.772  | 256.176 B | Base |   0.00 % |
| Json  | 186.400 ns | 166.907 ns | 638.003  |  81.968 B | N/A  | -47.66 % |
--- Scale 10,000 -------------------------------------------- Time 0.456 ---
| Split | 114.009 ns | 106.419 ns | 388.291  | 263.059 B | Base |   0.00 % |
| Json  | 168.608 ns | 154.450 ns | 574.312  |  82.574 B | N/A  | -47.89 % |
--- Scale 100,000 ------------------------------------------- Time 5.545 ---
| Json  | 206.117 ns | 199.416 ns | 701.200  |  75.731 B | N/A  |  24.02 % |
| Split | 271.281 ns | 257.446 ns | 810.403  | 144.212 B | Base |   0.00 % |
----------------------------------------------------------------------------

摘要

正如您所看到的,JsonConvert 起初较慢,但它能够很好地扩展,还可以避免转义问题(如已讨论),建议您使用它。此外,它的代码更简洁。

祝您好运!


1
假设这是真正的JSON,我建议使用JSON解析器。
其他的解决方案如Split / Select等注定会失败,因为它们没有考虑转义字符和JSON的其他具体内容,比如内联双引号"和其他转义的UTF-8代理项。
完整的解决方案在此这里
另一方面,如果它只是一个看起来像JSON的字符串,您也可以使用其他答案中描述的任何其他方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接