c# - 拆分字符串并在 C# 中连接所有第一个元素,然后连接第二个元素,依此类推

标签 c# .net arrays linq

我有这样一个字符串 -

var roleDetails = "09A880C2-8732-408C-BA09-4AD6F0A65CE9^Z:WB:SELECT_DOWNLOAD:0000^Product Delivery - Download^1,24B11B23-1669-403F-A24D-74CE72DFD42A^Z:WB:TRAINING_SUBSCRIBER:0000^Training Subscriber^1,6A4A6543-DB9F-46F2-B3C9-62D69D28A0B6^Z:WB:LIC_MGR_HOME_REDL:0000^License Manager - Home use^1,76B3B165-0BB4-4E3E-B61F-0C0292342CE2^Account Admin^Account Admin^1,B3C0CE51-00EE-4A0A-B208-98653E21AE11^Z:WB:1BENTLEY_ISA_ADMIN:0000^Co-Administrator^1,CBA225BC-680C-4627-A4F6-BED401682816^ReadOnly^ReadOnly^1,D80CF5CF-CB6E-4424-9D8F-E29F96EBD4C9^Z:WB:MY_SELECT_CD:0000^Product Delivery - DVD^1,E0275936-FBBB-4775-97D3-9A7D19D3E1B4^Z:WB:LICENSE_MANAGER:0000^License Manager^1";

用“,”拆分它返回这个 -

[0] "09A880C2-8732-408C-BA09-4AD6F0A65CE9^Z:WB:SELECT_DOWNLOAD:0000^Product Delivery - Download^1"
[1] "24B11B23-1669-403F-A24D-74CE72DFD42A^Z:WB:TRAINING_SUBSCRIBER:0000^Training Subscriber^1"
[2] "6A4A6543-DB9F-46F2-B3C9-62D69D28A0B6^Z:WB:LIC_MGR_HOME_REDL:0000^License Manager - Home use^1"
[3] "76B3B165-0BB4-4E3E-B61F-0C0292342CE2^Account Admin^Account Admin^1"    
[4] "B3C0CE51-00EE-4A0A-B208-98653E21AE11^Z:WB:1BENTLEY_ISA_ADMIN:0000^Co-Administrator^1"  
[5] "CBA225BC-680C-4627-A4F6-BED401682816^ReadOnly^ReadOnly^1"
[6] "D80CF5CF-CB6E-4424-9D8F-E29F96EBD4C9^Z:WB:MY_SELECT_CD:0000^Product Delivery - DVD^1"
[7] "E0275936-FBBB-4775-97D3-9A7D19D3E1B4^Z:WB:LICENSE_MANAGER:0000^License Manager^1"

所有元素都包含克拉 (^)。所以用 ^ 符号进一步拆分每个元素将返回四个元素。

但我想加入所有第一个元素,然后加入所有第二个元素,然后加入第三个元素,依此类推,得到这样的结果 -

[0]: 09A880C2-8732-408C-BA09-4AD6F0A65CE9, 24B11B23-1669-403F-A24D-74CE72DFD42A, 6A4A6543-DB9F-46F2-B3C9-62D69D28A0B6, 76B3B165-0BB4-4E3E-B61F-0C0292342CE2, B3C0CE51-00EE-4A0A-B208-98653E21AE11, CBA225BC-680C-4627-A4F6-BED401682816, D80CF5CF-CB6E-4424-9D8F-E29F96EBD4C9, E0275936-FBBB-4775-97D3-9A7D19D3E1B4

[1]: Z:WB:SELECT_DOWNLOAD:0000,Z:WB:TRAINING_SUBSCRIBER:0000, Z:WB:LIC_MGR_HOME_REDL:0000,Account Admin, Z:WB:1BENTLEY_ISA_ADMIN:0000, ReadOnly, Z:WB:MY_SELECT_CD:0000, Z:WB:LICENSE_MANAGER

[2]: Product Delivery - Download, Training Subscriber, License Manager - Home use, Account Admin, Co-Administrator, ReadOnly, Product Delivery - DVD, License Manager
[3]: 1,1,1,1,1,1,1,1

实现此目标最快最简单的方法是什么?

编辑

这是我到目前为止尝试过的 -

var rolearray = roleDetails.Split(',').Select(s => s.Split('^')).Select(a => new { RoleId = a[0], RoleNme = a[1], FriendlyName = a[2], IsUserInRole = a[3] });

但这又没有按我需要的方式返回。但我想加入所有 a[0]s ,然后加入所有 a[1] 等等

解决方案: 在比较解决方案并循环运行 10 次以查看性能后,我发现 Jamiec 建议的解决方案花费的时间更少。所以选择这个解决方案。

最佳答案

纯 LINQ 解决方案:

roleDetails.Split(',')
    .SelectMany(x => x.Split('^').Select((str, idx) => new {str, idx}))
    .GroupBy(x => x.idx)
    .Select(grp => string.Join(", ", grp.Select(x => x.str)))

关于c# - 拆分字符串并在 C# 中连接所有第一个元素,然后连接第二个元素,依此类推,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46113101/

相关文章:

javascript - 获取 JSON 对象中的数组并使用它来分配 div 的背景

c# - 如何检测可执行文件是否需要 UAC 提升(C# pref)

c# - 更整洁的 GetType().ToString() 用于封闭泛型

c# - 用于扩展方法的 WCF 命名约定

.net - 在 64 位进程中调用 DhcpGetClientInfo 失败

c - 将 uint8_t 数组切片

c# - IList<T> 没有 "where"

c# - 必须在 new Uri() 中使用 http ://1/? 才能获取 NameValueCollection

c# - .NET Framework - 降低版本

javascript - JavaScript 数组如何具有非数字键?