2

如果可能,我想在单一评估中执行这些操作:

  1. input根据分隔符将字符串分成几部分separator
  2. 将功能fnc(String) -> String应用于每个部分
  3. 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周围有辅助变量......

4

2 回答 2

1

经过额外的思考和尝试,我发现确实存在一个简单的解决方案:

result = String.Join(separator,
                     input.Split(separator).Select(
                     Function(part) fnc(part)).ToArray())

干净有效!

所以Select()问题中提到的方法是工作结果的方法。添加ToArray()到它的结果就行了

感谢您的所有帮助努力!

于 2013-09-03T16:27:07.010 回答
0

试试String.Join

在每个元素之间使用指定的分隔符连接字符串数组的所有元素。

通常这比Aggregate不需要所有匿名函数语法更整洁。它还具有仅在输入字符串之间放置分隔符的优点。使用聚合时,您通常必须修剪结果。

于 2013-09-03T15:25:56.350 回答