【发布时间】:2010-11-21 19:31:29
【问题描述】:
想象一下这些输入和结果:
[] -> ""
["Hello World!"] -> "Hello World!"
["Apples", "bananas"] -> "Apples, and bananas" (put your grammar books away)
["Lions", "Tigers", "Bears"] -> "Lions, Tigers, and Bears" (oh my!)
现在,假设输入都是IEnumerable<string>。用 C# 编写一个函数来做到这一点是什么好(好可能包括“小而整洁”、“易于理解”、“使用 LINQ 的全部功能”或其他,只要它是合理的)?我真的很想避免“命令式循环”方法。
我目前的做法是这样的:
string Commaize (IEnumerable<string> list) {
if (list.Count() > 1) {
list = list.Take(list.Count() - 2).Concat(
new[] { list.Reverse().Take(2).Reverse()
.Aggregate((a, b) => a + " and " + b) });
}
return String.Join(", ", list.ToArray());
}
但是感觉不是很“好”。它适用于 .NET3.5,因此此处需要 ToArray() 位。如果list 为 null,则结果为 UB。
【问题讨论】:
-
不是一个 exact 重复...这个使用牛津逗号,另一个问题没有。它实际上可以改变实现(我知道它改变了我的一点)。另外,请参阅Jeff Atwood's recent blog post,了解复制实际上是一件好事。