私はこの課題をstackoverflowコミュニティの注目を集めたかったのです。元の問題と答えはここにあります。ところで、あなたが以前にそれをフォローしていなかったなら、あなたはエリックのブログを読むことを試みるべきです、それは純粋な知恵です。
概要:
null以外のIEnumerableを受け取り、次の特性を持つ文字列を返す関数を記述します。
- シーケンスが空の場合、結果の文字列は「{}」です。
- シーケンスが単一アイテム「ABC」の場合、結果の文字列は「{ABC}」になります。
- シーケンスが2項目シーケンス「ABC」、「DEF」の場合、結果の文字列は「{ABCandDEF}」になります。
- シーケンスに「ABC」、「DEF」、「G」、「H」などの3つ以上の項目がある場合、結果の文字列は「{ABC、DEF、G、およびH}」になります。(注:オックスフォードコンマはありません!)
ご覧のとおり、私たち自身のJon Skeet(はい、同時に2つの場所にいることができることはよく知られています)が解決策を投稿しましたが、彼の(IMHO)は最もエレガントではありませんが、おそらくあなたはそれを打ち負かすことはできませんパフォーマンス。
どう思いますか?そこにはかなり良いオプションがあります。私は、(Fernando Nicoletの)selectメソッドとaggregateメソッドを含むソリューションの1つが本当に好きです。Linqは非常に強力であり、このような課題に時間を割くことで多くのことを学ぶことができます。私はそれを少しひねったので、それはもう少しパフォーマンスが高く、明確です(カウントを使用し、リバースを回避することによって):
public static string CommaQuibbling(IEnumerable<string> items)
{
int last = items.Count() - 1;
Func<int, string> getSeparator = (i) => i == 0 ? string.Empty : (i == last ? " and " : ", ");
string answer = string.Empty;
return "{" + items.Select((s, i) => new { Index = i, Value = s })
.Aggregate(answer, (s, a) => s + getSeparator(a.Index) + a.Value) + "}";
}