如果可能,我想在单一评估中执行这些操作:
input
根据分隔符将字符串分成几部分separator
- 将功能
fnc(String) -> String
应用于每个部分 result
使用相同的分隔符将部分重新连接回字符串separator
就这样。
我能想到的最好的是(这是在VB中)
result = input.Split(separator).Aggregate(String.Empty,
Function(result, part) _
result & If(result = String.Empty, String.Empty, separator) &
fnc(part))
如您所见,这很丑陋,因为
Aggregate()
需要在第一个参数中初始化(如果Aggregate()
在没有第一个参数的情况下使用,它不会调用fnc()
数组的第一个元素)这种方法强制
if()
使用,否则separator
添加到结果的开头
Select()
我尝试SelectMany()
在Split()
通过String.Join()
.
这是在运行时崩溃的有效形式:
result = String.Join(separator, input.Split(separator).SelectMany(Function(part) fnc(part)))
有例外:
System.InvalidCastException:无法转换类型的对象 'd__14`2[System.String,System.Char]' 输入'System.String[]'。
您能否提出更好的评估方法?如果可以这样Select()
并SelectMany()
与String.Join()
...一起工作,还是有其他有效的方法?
随意用 VB 或 C# 回复。
编辑:这是关于如何做到这一点,而不是关于这样的代码对某人来说有多容易阅读。此处使用的Lambda 表达式对许多程序员来说看起来很陌生。我们都知道解决这个问题的经典方法是怎样的——foreach
周围有辅助变量......