将字符串拆分为GUID数组

13

如果我有一个用管道符分隔的列表,我能否自动将它们拆分成GUID数组?

比如:

"guid1|guid2"

然后使用Guid[] values = selectedValue.Split("|".ToCharArray()); 就可以了。


2
将其分割为字符串数组。现在你只需要将字符串数组转换为GUID数组即可。不要害羞,这只是编程。 - Raymond Chen
@RaymondChen,是的,我意识到了,但我认为可能有更优雅的方法,而LINQ似乎很适合。 - griegs
2个回答

32

几乎:

Guid[] values = selectedValue.Split('|').Select(s => Guid.Parse(s)).ToArray();

如果任何一个 Guid 不是有效的,这将抛出一个 FormatException 异常。

如果您想忽略它们,您可以按照 Jeremy 在评论中提出的建议进行操作:

"9FE027E0-CF95-492F-821C-3F2EC9472657|bla|D94DF6DB-85C1-4312-9702-FB03A731A2B1"
.Split('|')
.Where(g => { Guid temp; return Guid.TryParse(g, out temp); })
.Select(g => Guid.Parse(g))
.ToArray()

也许这还可以进一步优化(我们实际上是两次解析每个数字),或者干脆忽略它,因为有97%的早期优化并不重要。


2
也许可以在那里塞进一个 .Where(s=>Guid.TryParse(s, out foo)) - Jeremy Holovacs
1
您可以通过使用 SelectMany 来避免双重解析。 s.Split('|') .SelectMany(s => { Guid g; return Guid.TryParse(s, out g) ? new Guid[] { g } : new Guid[] { }; }) .ToArray() - Raymond Chen

0
为了避免双重解析,我会“重新表述”它:
"9FE027E0-CF95-492F-821C-3F2EC9472657|bla|D94DF6DB-85C1-4312-9702-FB03A731A2B1"
    .Split('|')
    .Select(g => { Guid temp; return Guid.TryParse(g, out temp) ?  temp : Guid.Empty; })
    .Where(g=>g != Guid.Empty)
    .ToArray();

1
如果其中一个GUID为空,则此代码将无法运行 9FE027E0-CF95-492F-821C-3F2EC9472657|00000000-0000-0000-0000-000000000000|D94DF6DB-85C1-4312-9702-FB03A731A2B1 - AstroSharp

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