<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx</link><description>[UPDATE: Holy goodness. Apparently this was a more popular pasttime than I anticipated. There's like a hundred solutions in there. Who knew there were that many ways to stick commas in a string? It will take me some time to go through them all, so don't</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9550939</link><pubDate>Wed, 15 Apr 2009 18:18:54 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9550939</guid><dc:creator>Viacheslav Ivanov</dc:creator><description>&lt;P&gt;What should be returned for new[] { "", ",", "}" }? &lt;/P&gt;
&lt;P&gt;"{, , and }}"?&lt;/P&gt;
&lt;P&gt;"{"", "," and "}"}"?&lt;/P&gt;
&lt;P&gt;Something else?&lt;/P&gt;
&lt;DIV class=yellowbox&gt;
&lt;P&gt;The former seems reasonable. Basically, I don't expect you to parse the inputs. -- Eric&lt;/P&gt;&lt;/DIV&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551172</link><pubDate>Wed, 15 Apr 2009 21:59:58 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551172</guid><dc:creator>Adam Trahan</dc:creator><description>&lt;P&gt;This is what I came up with.&lt;/P&gt;
&lt;P&gt;private string buildCommaSeperatedList(IEnumerable&amp;lt;string&amp;gt; Items)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Create List from IEnumerable&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;string&amp;gt; ListItems = new List&amp;lt;string&amp;gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach (string item in Items)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ListItems.Add(item);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Instantiate Return Value&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuilder CommaSeperatedList = new StringBuilder();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Add Ending Bracket&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CommaSeperatedList.Append("}");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Get the index of the last item in the list&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int LastIndex = ListItems.Count - 1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Loop through the list in reverse order.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = LastIndex; i &amp;gt;= 0; i--)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Add " and " between the last two items.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (i == LastIndex - 1) CommaSeperatedList.Insert(0, " and ");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Add commas for all items before the second to last item.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (i &amp;lt; LastIndex - 1) CommaSeperatedList.Insert(0, ", ");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Add List Item&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CommaSeperatedList.Insert(0, ListItems[i]);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Add beginning bracket&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CommaSeperatedList.Insert(0, "{");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Return Comma Seperated List as a string&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return CommaSeperatedList.ToString();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;
&lt;DIV class=yellowbox&gt;
&lt;P&gt;Care to take a stab at what the asymptotic order of this algorithm is? -- Eric&lt;/P&gt;&lt;/DIV&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551211</link><pubDate>Wed, 15 Apr 2009 22:11:49 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551211</guid><dc:creator>Jon Skeet</dc:creator><description>&lt;P&gt;Great question. Hopefully this will format reasonably... if not I'll mail it to Eric. The restatement of the problem is in the XML comments for the method.&lt;/P&gt;
&lt;P&gt;using System;&lt;BR&gt;using System.Collections.Generic;&lt;BR&gt;using System.Text;&lt;BR&gt;class CommaTeaser&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;static void Main()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Test();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Test("ABC");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Test("ABC", "DEF");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Test("ABC", "DEF", "G", "H");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;static void Test(params string[] words)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(JoinWords(words));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// Joins words as per Eric's post.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;remarks&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// Restating the problem:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// 1) We always start with "{" and end with "}"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// 2) The last word has no suffix&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// 3) The penultimate word has a suffix of " and "&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// 4) All other words have a suffix of ", "&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// Now to work out the last and penultimate words, we just&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// have to keep a "buffer" of the last two words we've&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// seen.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;/remarks&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp;static string JoinWords(IEnumerable&amp;lt;string&amp;gt; words)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuilder builder = new StringBuilder("{");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string last = null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string penultimate = null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach (string word in words)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Shuffle existing words down&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (penultimate != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.Append(penultimate);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.Append(", ");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;penultimate = last;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;last = word;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (penultimate != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.Append(penultimate);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.Append(" and ");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (last != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.Append(last);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.Append("}");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return builder.ToString();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;}&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551213</link><pubDate>Wed, 15 Apr 2009 22:13:43 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551213</guid><dc:creator>Adam Trahan</dc:creator><description>&lt;P&gt;This is a little less dumb.&lt;/P&gt;
&lt;P&gt;private string buildCommaSeperatedList(IEnumerable&amp;lt;string&amp;gt; Items)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Create List from IEnumerable&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;string&amp;gt; ListItems = new List&amp;lt;string&amp;gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach (string item in Items)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ListItems.Add(item);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Instantiate Return Value&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuilder CommaSeperatedList = new StringBuilder();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CommaSeperatedList.Append("{");//Add Ending Bracket&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Loop through the list.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 0; i &amp;lt;= ListItems.Count - 1; i++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Add List Item&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CommaSeperatedList.Append(ListItems[i]);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Add " and " between the last two items.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (i == ListItems.Count - 2) CommaSeperatedList.Append(" and ");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Add commas for all items before the second to last item.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (i &amp;lt; ListItems.Count - 2) CommaSeperatedList.Append(", ");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CommaSeperatedList.Append("}");//Add ending bracket&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Return Comma Seperated List as a string&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return CommaSeperatedList.ToString();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551224</link><pubDate>Wed, 15 Apr 2009 22:22:22 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551224</guid><dc:creator>SteveEisner</dc:creator><description>&lt;P&gt;Here's mine that does a single pass without foreach. &amp;nbsp;It's a little like Jon's, rolled up&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public string CommaList(IEnumerable&amp;lt;string&amp;gt; e)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;using (var en = e.GetEnumerator())&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Handle 0 or 1 words&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var word = en.MoveNext() ? en.Current : "";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!en.MoveNext())&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return "{" + word + "}";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Handle 2 or more words&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var sb = new StringBuilder(word);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;do&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;word = en.Current;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!en.MoveNext()) // This was the last word&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return "{" + sb.ToString() + " and " + word + "}";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append(", ");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append(word);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} while (true);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551228</link><pubDate>Wed, 15 Apr 2009 22:23:37 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551228</guid><dc:creator>SteveEisner</dc:creator><description>&lt;p&gt;err, I mean, it's a little like Jon's rolled up, but my two buckets are &amp;quot;word&amp;quot; and &amp;quot;en.Current&amp;quot;&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551241</link><pubDate>Wed, 15 Apr 2009 22:27:02 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551241</guid><dc:creator>Adam Trahan</dc:creator><description>&lt;p&gt;@Jon Skeet - I really like the way your &amp;quot;buffer&amp;quot; works. &amp;nbsp;I wish I would have thought of that. &amp;nbsp;I wouldn't have needed to convert the IEnumerable&amp;lt;string&amp;gt; to a list&amp;lt;string&amp;gt;&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551242</link><pubDate>Wed, 15 Apr 2009 22:27:34 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551242</guid><dc:creator>Igor</dc:creator><description>&lt;P&gt;You can use the StringBuilder trick you described in the last post. Build the list as before, track the last comma and replace it with " and"&lt;/P&gt;
&lt;P&gt;Something along these lines (haven't tried to compile):&lt;/P&gt;
&lt;P&gt;string Join(IEnumerable&amp;lt;string&amp;gt; data) {&lt;BR&gt;&amp;nbsp;StringBuilder sb = new StringBuilder("{");&lt;BR&gt;&amp;nbsp;bool isFirst = true;&lt;BR&gt;&amp;nbsp;int off;&lt;BR&gt;&amp;nbsp;foreach(string s in data) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;off = sb.Length;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(!isFirst) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append(", ");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isFirst = false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append(s);&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;if(off &amp;gt; 0) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Remove(off, 1);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Insert(" and");&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;sb.Append("}");&lt;BR&gt;}&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551244</link><pubDate>Wed, 15 Apr 2009 22:27:45 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551244</guid><dc:creator>DRBlaise</dc:creator><description>&lt;P&gt;public static string CommaQuibbling(this IEnumerable&amp;lt;string&amp;gt; items) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;using (IEnumerator&amp;lt;string&amp;gt; enumtor = items.GetEnumerator())&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (new StringBuilder()).AppendBracketed(enumtor).ToString();&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;static StringBuilder AppendBracketed(this StringBuilder builder, Enumerator&amp;lt;string&amp;gt; enumtor) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return builder.Append('{').AppendNoneOrMore(enumtor).Append('}');&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;static StringBuilder AppendNoneOrMore(this StringBuilder builder, IEnumerator&amp;lt;string&amp;gt; enumtor) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return enumtor.MoveNext()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;? builder.AppendOneOrMore(enumtor.Current, enumtor)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;: builder;&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;static StringBuilder AppendOneOrMore(this StringBuilder builder, string first, IEnumerator&amp;lt;string&amp;gt; enumtor) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return enumtor.MoveNext()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;? builder.AppendTwoOrMore(first, enumtor.Current, enumtor)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;: builder.Append(first);&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;static StringBuilder AppendTwoOrMore(this StringBuilder builder, string first, string second, IEnumerator&amp;lt;string&amp;gt; enumtor) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return enumtor.MoveNext()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;? builder.Append(first).Append(", ").AppendTwoOrMore(second, enumtor.Current, enumtor)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;: builder.Append(first).Append(" and ").Append(second);&lt;BR&gt;}&lt;/P&gt;
&lt;DIV class=yellowbox&gt;
&lt;P&gt;Slick. But at what size list does this cause your program to crash with an out-of-stack exception? -- Eric&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551250</link><pubDate>Wed, 15 Apr 2009 22:30:13 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551250</guid><dc:creator>pete.d</dc:creator><description>&lt;p&gt;Well, I was going to post my solution. &amp;nbsp;But then I saw that Jon Skeet had already done so.&lt;/p&gt;
&lt;p&gt;For the record, I prefer that approach, because it's doable without getting into the enumerator itself. &amp;nbsp;I find that more elegant than explicitly accessing the enumerator methods.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551254</link><pubDate>Wed, 15 Apr 2009 22:30:47 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551254</guid><dc:creator>Chris Meadowcroft</dc:creator><description>&lt;P&gt;This would be my version of a function that fulfills the requirement efficiently while being pretty clear in how it works&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp;class Program&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static void Main(string[] args)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(BuildStringWithEnglishListSyntax(new string[] { }));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(BuildStringWithEnglishListSyntax(new string[] { "ABC" }));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(BuildStringWithEnglishListSyntax(new string[] { "ABC", "DEF" }));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(BuildStringWithEnglishListSyntax(new string[] { "ABC", "DEF", "G", "H" }));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(BuildStringWithEnglishListSyntax(new string[] { "", ",", "}" }));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.ReadKey(true);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const string EnglishListPrefix = "{";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const string EnglishListSuffix = "}";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const string IntermediateSeparator = ", ";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const string LastSeparator = " and ";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static string BuildStringWithEnglishListSyntax(IEnumerable&amp;lt;string&amp;gt; itemsEnumerable)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuilder result = new StringBuilder(EnglishListPrefix);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;using(IEnumerator&amp;lt;string&amp;gt; items = itemsEnumerable.GetEnumerator())&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(items.MoveNext()) &amp;nbsp;// make sure it's not an empty list&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bool isFirstString = true;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bool isLastString = false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(!isLastString)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string current = items.Current;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isLastString = !items.MoveNext();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(!isFirstString)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result.Append(isLastString ? LastSeparator : IntermediateSeparator);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isFirstString = false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result.Append(current);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result.Append(EnglishListSuffix);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return result.ToString();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551279</link><pubDate>Wed, 15 Apr 2009 22:41:48 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551279</guid><dc:creator>Olivier Leclant</dc:creator><description>&lt;p&gt;&amp;gt; I am particularly interested in solutions which make the semantics of the code very clear to the code maintainer.&lt;/p&gt;
&lt;p&gt;Readability is terseness.&lt;/p&gt;
&lt;p&gt;static string JoinStrings(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;var list = strings.ToList();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (list.Count == 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (list.Count == 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + list.First() + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + string.Join(&amp;quot;, &amp;quot;, list.GetRange(0, list.Count - 1).ToArray()) + &amp;quot; and &amp;quot; + list.Last() + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551284</link><pubDate>Wed, 15 Apr 2009 22:43:30 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551284</guid><dc:creator>Jeff Yates</dc:creator><description>&lt;p&gt;I didn't include comments, but this works with lazy evaluation of the enumerable.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string FormatString(IEnumerable&amp;lt;string&amp;gt; stringsToFormat)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;const string Separator = &amp;quot;, &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder builder = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append('{');&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string lastItem = string.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string item in stringsToFormat)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(item + Separator);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;lastItem = item;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int lengthOfReplacedString = (lastItem.Length + (Separator.Length * 2));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lengthOfReplacedString &amp;lt; builder.Length)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Replace(&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Separator + lastItem + Separator,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot; and &amp;quot; + lastItem,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Length - lengthOfReplacedString,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;lengthOfReplacedString);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Replace(Separator, string.Empty);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append('}');&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return builder.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551294</link><pubDate>Wed, 15 Apr 2009 22:50:34 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551294</guid><dc:creator>Brian Dukes</dc:creator><description>&lt;P&gt;The first reasonable idea I came up with was to create a list of KeyValuePairs, where the Value is the separator that goes before the value.&lt;/P&gt;
&lt;DIV class=yellowbox&gt;
&lt;P&gt;I note that you have&amp;nbsp;redefined the &lt;EM&gt;meaning&lt;/EM&gt; of&amp;nbsp;an existing class rather than defining your own. I personally would use KeyValuePair only for storing pairs of keys and their related values, so that the code is clear to the reader. If you want an "item and separator pair" class, I'd either use a general-purpose tuple, or define an "ItemAndSeparatorPair" class. That said, nice solution.&amp;nbsp;-- Eric&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string ConcatenateSequence(IEnumerable&amp;lt;string&amp;gt; stringSequence)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var strings = stringSequence.ToList().ConvertAll(input =&amp;gt; new KeyValuePair&amp;lt;string, string&amp;gt;(input, ", "));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (strings.Count &amp;gt; 1)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var lastItem = strings[strings.Count - 1];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strings[strings.Count - 1] = new KeyValuePair&amp;lt;string, string&amp;gt; lastItem.Key, " and ");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var sequenceBuilder = new StringBuilder("{");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bool isFirst = true;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach (KeyValuePair&amp;lt;string, string&amp;gt; valueSeparatorPair in strings)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!isFirst)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sequenceBuilder.Append(valueSeparatorPair.Value);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sequenceBuilder.Append(valueSeparatorPair.Key);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isFirst = false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sequenceBuilder.Append("}");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return sequenceBuilder.ToString();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551295</link><pubDate>Wed, 15 Apr 2009 22:52:21 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551295</guid><dc:creator>Dave</dc:creator><description>&lt;p&gt;I agree with Olivier that readability is terseness. That solution is clear and takes very little code. More lines equals more bugs.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551303</link><pubDate>Wed, 15 Apr 2009 22:57:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551303</guid><dc:creator>Jacob</dc:creator><description>&lt;P&gt;Here are a few variations on a theme:&lt;/P&gt;
&lt;P&gt;string[] strings = { "ABC", "DEF", "G", "H" };&lt;BR&gt;IEnumerable&amp;lt;string&amp;gt; separators = new[] { "", " and " }&lt;BR&gt;.Concat(Enumerable.Repeat(", ", int.MaxValue));&lt;BR&gt;string result = "{" + strings&lt;BR&gt;.Reverse()&lt;BR&gt;.Select((str, index) =&amp;gt; str + separators.ElementAt(index))&lt;BR&gt;.Aggregate((s1, s2) =&amp;gt; s2 + s1) + "}";&lt;BR&gt;//---------&lt;BR&gt;int position = 0;&lt;BR&gt;StringBuilder result2 = strings.Reverse().Aggregate(new StringBuilder("{}"),&lt;BR&gt;(sb, str) =&amp;gt; sb.Insert(1, position++ == 1 ? " and " : position &amp;gt; 1 ? ", " : "").Insert(1, str));&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551304</link><pubDate>Wed, 15 Apr 2009 22:57:06 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551304</guid><dc:creator>mdefalco</dc:creator><description>&lt;P&gt;I went for clarity over efficiency.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string Format(IEnumerable&amp;lt;String&amp;gt; words)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int count = words.Count();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (count == 0) return "{}";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (count == 1) return string.Format("{{{0}}}", words.Single());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string commaDelimited = words.Take(count - 1).Aggregate((list, word) =&amp;gt; string.Format("{0}, {1}", list, word));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return string.Format("{{{0} and {1}}}", commaDelimited, words.Last());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551305</link><pubDate>Wed, 15 Apr 2009 22:57:12 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551305</guid><dc:creator>Sam Webb</dc:creator><description>&lt;p&gt;I'm not particularly familiar with all the available LINQ methods, but I imagine that if &amp;quot;readability&amp;quot; is what you're going for, a LINQ based approach would be the best. That said, if you are considering the case of many thousands of strings in enumerable, possibly being called many thousands of times, then you want a case that iterates only once all the way through while still being readable. Thus, any one of the above suggestions that meet the criteria are just as good (Jon Skeet's is my current favorite choice).&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551313</link><pubDate>Wed, 15 Apr 2009 23:00:06 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551313</guid><dc:creator>Rick Dailey</dc:creator><description>&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string GetCombined(IEnumerable&amp;lt;string&amp;gt; strings)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string opening = "{";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var builder = new StringBuilder(opening);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var enumerator = strings.GetEnumerator();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bool hasNext = enumerator.MoveNext();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (hasNext)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string s = enumerator.Current;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hasNext = enumerator.MoveNext();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (builder.Length &amp;gt; opening.Length) // after the opening curly brace&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.Append(hasNext ? ", " : " and ");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.Append(s);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.Append('}');&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return builder.ToString();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551319</link><pubDate>Wed, 15 Apr 2009 23:03:20 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551319</guid><dc:creator>Fahad</dc:creator><description>&lt;p&gt;&amp;gt;&amp;gt; Extension methods &amp;lt;&amp;lt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static void IterateIndex&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; items, Action&amp;lt;int, T&amp;gt; action)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IterateIndex(items, action, 0);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static void IterateIndex&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; items, Action&amp;lt;int, T&amp;gt; action, int idx)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (items == null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new ArgumentNullException(&amp;quot;items&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (action == null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new ArgumentNullException(&amp;quot;action&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IEnumerator&amp;lt;T&amp;gt; enumerator = items.GetEnumerator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Adjusting values&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int count = 0; count &amp;lt; idx; count++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;enumerator.MoveNext();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (enumerator.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;action(idx, enumerator.Current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;idx++;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt; Function &amp;lt;&amp;lt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string GetComma(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var count = strings.Count();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;strings.IterateIndex&amp;lt;string&amp;gt;((i, s) =&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (count &amp;gt; 1 &amp;amp;&amp;amp; i == count - 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot; AND &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if (i &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;,&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot; &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(s);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;});&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;Execute&amp;lt;&amp;lt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var s1 = new List&amp;lt;string&amp;gt;();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var s2 = new List&amp;lt;string&amp;gt;() { &amp;quot;One&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var s3 = new List&amp;lt;string&amp;gt;() { &amp;quot;One&amp;quot;, &amp;quot;Two&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var s4 = new List&amp;lt;string&amp;gt;() { &amp;quot;One&amp;quot;, &amp;quot;Two&amp;quot;, &amp;quot;Three&amp;quot;, &amp;quot;Four&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(GetComma(s1));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(GetComma(s2));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(GetComma(s3));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(GetComma(s4));&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551320</link><pubDate>Wed, 15 Apr 2009 23:03:24 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551320</guid><dc:creator>tomlev</dc:creator><description>&lt;p&gt;Here's mine. It's not particularly brilliant or elegant, but at least it's short and easy to understand ;)&lt;/p&gt;
&lt;p&gt;The main drawback of this solution is that the strings are actually enumerated twice (in ToArray then in Join), although there's no explicit loop&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static string FormatList(IEnumerable&amp;lt;string&amp;gt; list)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[] tab = list.ToArray();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int n = tab.Length;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string tmp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (n &amp;gt; 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tmp = String.Join(&amp;quot;, &amp;quot;, tab, 0, n - 1);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tmp += &amp;quot; and &amp;quot; + tab[n - 1];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tmp = String.Join(&amp;quot; and &amp;quot;, tab);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + tmp + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551321</link><pubDate>Wed, 15 Apr 2009 23:03:51 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551321</guid><dc:creator>Patrick Dewane</dc:creator><description>&lt;P&gt;Oh great, Jon Skeet posted! Of course I'm just kidding. I'm sure some of my ideas have already been posted but that's ok...&lt;/P&gt;
&lt;P&gt;Here's the meat and potatoes:&lt;/P&gt;
&lt;P&gt;public static string FormatAsString(this IEnumerable&amp;lt;string&amp;gt; Sequence, string ItemSeparator, string LastItemSeparator)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;var formattedString = new StringBuilder();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;string prev = null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach (string s in Sequence)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// the trick is to save the last item in the sequence for use outside of this loop&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (prev != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formattedString.Append(prev);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formattedString.Append(ItemSeparator);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prev = s;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (prev != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (formattedString.Length &amp;gt; 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formattedString.Append(LastItemSeparator);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formattedString.Append(prev);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;formattedString.Append("}");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return "{" + formattedString.ToString();&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;Which can be called like this:&lt;/P&gt;
&lt;P&gt;string GetSequenceAsFormattedString(IEnumerable&amp;lt;string&amp;gt; Sequence)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (Sequence == null)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return string.Empty;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return Sequence.FormatAsString(", ", "and ");&lt;BR&gt;}&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551323</link><pubDate>Wed, 15 Apr 2009 23:04:19 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551323</guid><dc:creator>Bahador</dc:creator><description>&lt;P&gt;static string CommaSeparatedString(IEnumerable&amp;lt;string&amp;gt; input)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; string first = "", last = null;&lt;BR&gt;&amp;nbsp; var rest = new StringBuilder();&lt;BR&gt;&amp;nbsp; IEnumerator&amp;lt;string&amp;gt; en = input.GetEnumerator();&lt;BR&gt;&amp;nbsp; if (en.MoveNext())&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; first = en.Current;&lt;BR&gt;&amp;nbsp; if (en.MoveNext())&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; last = en.Current;&lt;BR&gt;&amp;nbsp; while (en.MoveNext())&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rest.Append(", ").Append(last);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; last = en.Current;&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; if (last != null)&lt;BR&gt;&amp;nbsp; rest.Append(" and ").Append(last);&lt;BR&gt;&amp;nbsp; return "{" + first + rest + "}";&lt;BR&gt;}&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551342</link><pubDate>Wed, 15 Apr 2009 23:11:01 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551342</guid><dc:creator>Alex Morris</dc:creator><description>&lt;p&gt;I don't particularly like this solution from the perspective of the maintainer, but off the top of my head it's hard to find a much more readable solution. &amp;nbsp;I look forward to seeing Eric's suggestion for how to do this.&lt;/p&gt;
&lt;p&gt;[STAThread]&lt;/p&gt;
&lt;p&gt;static void Main() {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Console.WriteLine(GenerateSet(new string[] { }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Console.WriteLine(GenerateSet(new string[] { &amp;quot;ABC&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Console.WriteLine(GenerateSet(new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Console.WriteLine(GenerateSet(new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Console.WriteLine(GenerateSet(new string[] { &amp;quot;Sample and other stuff&amp;quot;, &amp;quot;Hello, World!&amp;quot;, &amp;quot;XYZ&amp;quot;, &amp;quot;42&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;This is a test&amp;quot;, &amp;quot;Last&amp;quot; }));&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;static private string GenerateSet(IEnumerable&amp;lt;string&amp;gt; items) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int itemsAdded = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;string current = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;foreach(string item in items) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(current != null) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(itemsAdded != 0) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;++itemsAdded;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;current = item;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if(current != null) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(itemsAdded != 0) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return sb.ToString();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551356</link><pubDate>Wed, 15 Apr 2009 23:16:25 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551356</guid><dc:creator>Skrud</dc:creator><description>&lt;p&gt;Here's my solution, that I tried to keep as short as possible. I only have access to .NET 2.0 here so nothing fancy. You'll notice that this is pretty similar to Olivier's solution up above. I agree entirely that readability and terseness go hand in hand. I didn't want to mess with flags or anything else that was not directly related to the problem I was trying to solve.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string FancyConcat(IEnumerable&amp;lt;string&amp;gt; strEnumerable) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;string&amp;gt; strList = new List&amp;lt;string&amp;gt;(strEnumerable);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (strList.Count &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(string.Join(&amp;quot;, &amp;quot;, strList.GetRange(0, strList.Count - 1).ToArray()));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (strList.Count &amp;gt; 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(strList[strList.Count - 1]);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551372</link><pubDate>Wed, 15 Apr 2009 23:22:13 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551372</guid><dc:creator>Matthew Cole</dc:creator><description>&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string Quibble(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string toReturn = &amp;quot;{&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int count = strings.Count(str =&amp;gt; str != null);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; count; i++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (i == count-1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;toReturn += strings.ElementAt(i);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string delim = &amp;quot;, &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (i == (count-2))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;delim = &amp;quot; and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;toReturn += (strings.ElementAt(i) + delim);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;toReturn += &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return toReturn;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551406</link><pubDate>Wed, 15 Apr 2009 23:35:27 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551406</guid><dc:creator>Cheddar</dc:creator><description>&lt;p&gt;Here's my .02&lt;/p&gt;
&lt;p&gt;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Console.WriteLine(list(null));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Console.WriteLine(list(new[] { &amp;quot;ABC&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Console.WriteLine(list(new[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Console.WriteLine(list(new[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Console.WriteLine(&amp;quot;Press any key&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Console.ReadLine();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;public static string list(IEnumerable&amp;lt;string&amp;gt; words)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;string escape = &amp;quot;\n&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;string delim = &amp;quot;, &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;string finalDelim = &amp;quot; and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (words == null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;string sentence = &amp;quot;{&amp;quot; + string.Join(escape, words.ToArray()) + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int lastCommaPosition = sentence.LastIndexOf(escape);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (lastCommaPosition &amp;gt; -1 &amp;amp;&amp;amp; (sentence.IndexOf(escape) &amp;lt; lastCommaPosition))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string remainder = sentence.Substring(lastCommaPosition + 1, sentence.Length - (lastCommaPosition + 1));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sentence = sentence.Replace(sentence.Substring(lastCommaPosition, sentence.Length - lastCommaPosition), finalDelim + remainder);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;sentence = sentence.Replace(escape, delim);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return sentence;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551409</link><pubDate>Wed, 15 Apr 2009 23:39:59 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551409</guid><dc:creator>James Moore</dc:creator><description>&lt;p&gt;Here's my solution:&lt;/p&gt;
&lt;p&gt;module StringCombiner =&lt;/p&gt;
&lt;p&gt; &amp;nbsp;let CombineStrings (i: 'a list) =&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;// F# gives us easy ways to look&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;// at the head of a list plus everything&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;// else. &amp;nbsp;In this case, we want the&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;// last item plus all the items before&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;// it, so just reverse the list&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;match List.rev i with&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;| [] -&amp;gt; &amp;quot;{}&amp;quot; &amp;nbsp;// No items, then just return curly braces&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;| h :: [] -&amp;gt; sprintf &amp;quot;{%s}&amp;quot; (h.ToString()) &amp;nbsp;// One item, return the item in curly braces&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;| lastItem :: firstItemsReversed -&amp;gt; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;let firstItemsAsStrings = List.map (fun f -&amp;gt; f.ToString()) (List.rev firstItemsReversed)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;let firstItemsJoinedWithCommas = String.concat &amp;quot;, &amp;quot; firstItemsAsStrings&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;sprintf &amp;quot;{%s and %s}&amp;quot; firstItemsJoinedWithCommas (lastItem.ToString())&lt;/p&gt;
&lt;p&gt; &amp;nbsp;let CombineStringsGivenIterator (i: 'a seq) =&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;CombineStrings (Seq.to_list i)&lt;/p&gt;
&lt;p&gt;It's a pretty standard list comprehension problem.&lt;/p&gt;
&lt;p&gt;From C#, this looks like (according to Reflector):&lt;/p&gt;
&lt;p&gt;[CompilationMapping(SourceConstructFlags.Module)]&lt;/p&gt;
&lt;p&gt;public static class StringCombiner&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;// Methods&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;static StringCombiner();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static string CombineStrings&amp;lt;A&amp;gt;(List&amp;lt;A&amp;gt; i);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static string CombineStringsFromIterator&amp;lt;A&amp;gt;(IEnumerable&amp;lt;A&amp;gt; i);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;// Nested Types&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;[Serializable]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;internal class clo@399&amp;lt;A&amp;gt; : FastFunc&amp;lt;A, string&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Methods&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public clo@399();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public override string Invoke(A f);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551410</link><pubDate>Wed, 15 Apr 2009 23:40:16 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551410</guid><dc:creator>Stuart Turner</dc:creator><description>&lt;p&gt;I was going post my solution, but I realized mdefalco pretty much did it already. &amp;nbsp;My only correction is that I would do a var arr = words.ToArray() and work off arr instead of words. &amp;nbsp;The reason is that many IQueryable&amp;lt;string&amp;gt; come from LINQ2SQL data sources and can only be enumerated once, which has bit me in the rear too many times. &amp;nbsp;As such, the ToArray would allow exactly one enumeration over the IEnumerable. &amp;nbsp;ToList() would also do the job.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551415</link><pubDate>Wed, 15 Apr 2009 23:43:31 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551415</guid><dc:creator>Vasu</dc:creator><description>&lt;P&gt;public static IEnumerable&amp;lt;string&amp;gt; GetStrings()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;yield return "ABC";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;yield return "CDE";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;yield return "G";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;yield return "H";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;Here is the code to generate the output...&lt;/P&gt;
&lt;P&gt;var x = GetStrings().Reverse().Skip(1).Reverse().ToArray();&lt;BR&gt;var z = String.Format("{0} {1} and {2} {3}", "{", String.Join(", ", x),&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetStrings().Last(), "}");&lt;BR&gt;Console.WriteLine(z);&lt;/P&gt;
&lt;DIV class=yellowbox&gt;
&lt;P&gt;What if the sequence only has one item? -- Eric&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551435</link><pubDate>Wed, 15 Apr 2009 23:49:53 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551435</guid><dc:creator>Ryan Heath</dc:creator><description>&lt;P&gt;using System;&lt;BR&gt;using System.Collections.Generic;&lt;BR&gt;public class CommaQuibbling&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; static string Extend(string concat, string separator, string value)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( value == null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return concat;&lt;BR&gt;&amp;nbsp; &amp;nbsp; if ( concat.Length &amp;gt; 1)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; return concat + separator + value;&lt;BR&gt;&amp;nbsp; &amp;nbsp; return concat + value;&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; static string Concat(IEnumerable&amp;lt;string&amp;gt; strings)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var concat = "{";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var iter = strings.GetEnumerator();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string lastItem = null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (iter.MoveNext())&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; concat = Extend(concat, ", ", lastItem);&lt;BR&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; lastItem = iter.Current;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; concat = Extend(concat," and ", lastItem);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return concat + "}";&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; static void TestConcat(IEnumerable&amp;lt;string&amp;gt; strings, string expected)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var value = Concat(strings);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WL("{0} == {1} =&amp;gt; {2}", expected, value, expected == value);&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; public static void Main()&lt;BR&gt;&amp;nbsp; {&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TestConcat(new string[]{}, "{}");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TestConcat(new []{"ABC"}, "{ABC}");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TestConcat(new []{"ABC", "DEF"}, "{ABC and DEF}");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TestConcat(new []{"ABC", "DEF", "G", "H"}, "{ABC, DEF, G and H}");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.ReadLine();&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; static void WL(object text, params object[] args)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(text.ToString(), args); &lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551436</link><pubDate>Wed, 15 Apr 2009 23:50:04 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551436</guid><dc:creator>Sean</dc:creator><description>&lt;p&gt;Here is my single pass solution&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public string MakeNonOxfordList(IEnumerable&amp;lt;string&amp;gt; values)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IEnumerator&amp;lt;string&amp;gt; enumerator = values.GetEnumerator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string current = &amp;quot;&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder output = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while(enumerator.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(output.Length&amp;gt;0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output.Append(current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;current = enumerator.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(output.Length==0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output.Append(current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; output.Append(&amp;quot; AND &amp;quot; + current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + output + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551444</link><pubDate>Wed, 15 Apr 2009 23:54:09 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551444</guid><dc:creator>Eric Willeke</dc:creator><description>&lt;P&gt;I went after two different options - one for utmost clarity and one for performance. I'd use the performant one if I was exposing this method as a public because I have no idea of what's being enumerated. &lt;/P&gt;
&lt;P&gt;However, I suspect that in some cases the internal unsafe implementation of string.Join will beat the StringBuilder, making the "clarity" approach faster than the "performant" approach. If I read the source right for string.Join, it will only ever do a single allocation, while StringBuilder will do a normal growth behavior as you add to it.&lt;/P&gt;
&lt;P&gt;using System;&lt;BR&gt;using System.Collections.Generic;&lt;BR&gt;using System.Linq;&lt;BR&gt;using System.Text;&lt;BR&gt;namespace StringGame&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;class Program&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private static string GetPrettyJoinClear(IEnumerable&amp;lt;string&amp;gt; theStrings)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;string&amp;gt; list = theStrings.ToList();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch (list.Count())&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 0:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return "{}";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 1:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return "{" + list[0] + "}";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case 2:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return "{" + list[0] + " and " + list[1] + "}";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Faster for some cases&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;list[0] = "{" + list[0];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;list[list.Count - 2] = string.Join(" and ", new string[] { list[list.Count - 2], list[list.Count - 1] + "}" });&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return string.Join(", ", list.Take(list.Count - 1).ToArray());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Clearer for all cases&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//return&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// &amp;nbsp; &amp;nbsp;"{" +&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// &amp;nbsp; &amp;nbsp;string.Join(", ", list.Take(list.Count - 1).ToArray()) +&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// &amp;nbsp; &amp;nbsp;" and " +&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// &amp;nbsp; &amp;nbsp;list[list.Count - 1] +&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// &amp;nbsp; &amp;nbsp;"}";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static string GetPrettyJoinOnePass(IEnumerable&amp;lt;string&amp;gt; theStrings)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuilder sb = new StringBuilder();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append("{");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IEnumerator&amp;lt;string&amp;gt; ie = theStrings.GetEnumerator();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bool isFirst = true;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bool isSecond = true;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string oneAgo = string.Empty;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string twoAgo = string.Empty;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach (string current in theStrings)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (isFirst)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oneAgo = current;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isFirst = false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (isSecond)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;twoAgo = oneAgo;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oneAgo = current;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isSecond = false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append(twoAgo);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append(", ");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;twoAgo = oneAgo;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oneAgo = current;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!isFirst)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!isSecond)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append(twoAgo);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append(" and ");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append(oneAgo);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append("}");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return sb.ToString();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string[] testArray26 = new string[] {&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"a", "b", "c", "d", "e",&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"f", "g", "h", "i", "j",&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"k", "l", "m", "n", "o",&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"p", "q", "r", "s", "t",&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"u", "v", "w", "x", "y", "z" };&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string[] testArray3 = new string[] { "A", "B", "C" };&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string [] testArray2 = new string[] { "A", "B"};&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string [] testArray1 = new string[] { "A" };&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string[] testArray0 = new string[] { };&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RunTest(testArray0);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RunTest(testArray1);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RunTest(testArray2);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RunTest(testArray3);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RunTest(testArray26);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.ReadLine();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static void RunTest(string[] activeArray)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string output = GetPrettyJoinOnePass(activeArray.AsEnumerable());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string output2 = GetPrettyJoinClear(activeArray.AsEnumerable());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine("Testing with string: " + string.Join("", activeArray));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine("One Pass Result : " + output);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine("Clear Result &amp;nbsp; &amp;nbsp;: " + output2 );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;}&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551451</link><pubDate>Wed, 15 Apr 2009 23:57:19 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551451</guid><dc:creator>Ryan Heath</dc:creator><description>&lt;p&gt;Whoops, I prefer tabs over spaces ;)&lt;/p&gt;
&lt;p&gt;I also left out StringBuilder and went for string concat for simplicity's sake.&lt;/p&gt;
&lt;p&gt;// Ryan&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551452</link><pubDate>Wed, 15 Apr 2009 23:57:35 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551452</guid><dc:creator>Hristo Deshev</dc:creator><description>&lt;p&gt;Here's my take in F#. Using pattern matching, the code reads just like the problem specification:&lt;/p&gt;
&lt;p&gt;#light&lt;/p&gt;
&lt;p&gt;let format (words:list&amp;lt;string&amp;gt;) =&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;let rec makeList (words: list&amp;lt;string&amp;gt;) =&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;match words with&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| [] -&amp;gt; &amp;quot;&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| first :: [] -&amp;gt; first&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| first :: second :: [] -&amp;gt; first + &amp;quot; and &amp;quot; + second&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| first :: second :: rest -&amp;gt; first + &amp;quot;, &amp;quot; + second + &amp;quot;, &amp;quot; + (makeList rest)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;&amp;quot;{&amp;quot; + (makeList words) + &amp;quot;}&amp;quot;&lt;/p&gt;
&lt;p&gt;and the test case:&lt;/p&gt;
&lt;p&gt;printfn &amp;quot;%s&amp;quot; (format []) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;printfn &amp;quot;%s&amp;quot; (format [&amp;quot;ABC&amp;quot;])&lt;/p&gt;
&lt;p&gt;printfn &amp;quot;%s&amp;quot; (format [&amp;quot;ABC&amp;quot;; &amp;quot;DEF&amp;quot;])&lt;/p&gt;
&lt;p&gt;printfn &amp;quot;%s&amp;quot; (format [&amp;quot;ABC&amp;quot;; &amp;quot;DEF&amp;quot;; &amp;quot;G&amp;quot;; &amp;quot;H&amp;quot;])&lt;/p&gt;
&lt;p&gt;yields:&lt;/p&gt;
&lt;p&gt;{}&lt;/p&gt;
&lt;p&gt;{ABC}&lt;/p&gt;
&lt;p&gt;{ABC and DEF}&lt;/p&gt;
&lt;p&gt;{ABC, DEF, G and H}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551463</link><pubDate>Thu, 16 Apr 2009 00:02:21 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551463</guid><dc:creator>Fernando Nicolet</dc:creator><description>&lt;p&gt;Here's my LINQ solution:&lt;/p&gt;
&lt;p&gt;public static string CommaQuibbling(IEnumerable&amp;lt;string&amp;gt; items)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Func&amp;lt;int, string&amp;gt; getSeparator = (i) =&amp;gt; i == 0 ? string.Empty : (i == 1 ? &amp;quot; and &amp;quot; : &amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;string answer = string.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + items&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Reverse()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Select((s, i) =&amp;gt; new { Index = i, Value = s })&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Aggregate(answer, (s, a) =&amp;gt; a.Value + getSeparator(a.Index) + s) + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551466</link><pubDate>Thu, 16 Apr 2009 00:02:38 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551466</guid><dc:creator>Joren</dc:creator><description>&lt;p&gt;I think most solutions posted here are convoluted. I also don't like building up strings and then later editing them to conform to the rules. Some of the posted solutions are very nice, though!&lt;/p&gt;
&lt;p&gt;I thought it'd be fun to build a short but sweet LINQed solution. Assume input is in 'IEnumerable&amp;lt;string&amp;gt; strings'.&lt;/p&gt;
&lt;p&gt;int last = strings.Count() - 1;&lt;/p&gt;
&lt;p&gt;Func&amp;lt;string, int, string&amp;gt; prefixer =&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;delegate(string s, int index)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (index == 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return s;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (index == last)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot; and &amp;quot; + s;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;, &amp;quot; + s;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;};&lt;/p&gt;
&lt;p&gt;return &amp;quot;{&amp;quot; + string.Concat(strings.Select(prefixer).ToArray()) + &amp;quot;}&amp;quot;;&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551474</link><pubDate>Thu, 16 Apr 2009 00:04:38 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551474</guid><dc:creator>John Spong</dc:creator><description>&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;using MbUnit.Framework;&lt;/p&gt;
&lt;p&gt;namespace TestApp.Fun {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;/// Solution to problem at &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;/// &lt;a rel="nofollow" target="_new" href="http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx"&gt;http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public class Comma_Quibbling {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string Concatenate(IEnumerable&amp;lt;string&amp;gt; sequence) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string remainderFormat = &amp;quot;{0}, &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string secondToLastFormat = &amp;quot;{0} and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string lastFormat = &amp;quot;{0}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Queue&amp;lt;string&amp;gt; queue = new Queue&amp;lt;string&amp;gt;(3);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string item in sequence) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;queue.Enqueue(item);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (queue.Count &amp;gt; 2) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.AppendFormat(remainderFormat, queue.Dequeue());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (queue.Count == 2) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.AppendFormat(secondToLastFormat, queue.Dequeue());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (queue.Count == 1) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.AppendFormat(lastFormat, queue.Dequeue());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[TestFixture]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public class UnitTests {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Row(new string[] { }, &amp;quot;{}&amp;quot;)]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Row(new string[] { &amp;quot;ABC&amp;quot; }, &amp;quot;{ABC}&amp;quot;)]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Row(new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; }, &amp;quot;{ABC and DEF}&amp;quot;)]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Row(new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; }, &amp;quot;{ABC, DEF, G and H}&amp;quot;)]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void TestConcat(IEnumerable&amp;lt;string&amp;gt; sequence, &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string expectedResult) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string result = Concatenate(sequence);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.AreEqual&amp;lt;string&amp;gt;(expectedResult, result);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551495</link><pubDate>Thu, 16 Apr 2009 00:13:36 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551495</guid><dc:creator>Kuno Woudt</dc:creator><description>&lt;p&gt;This looked like a fun problem, I'm a python guy though, so tried to solve it in python.&lt;/p&gt;
&lt;p&gt;In python I would convert the input to a list too. I don't think there is any performance benefit in looping over the input data directly, as concatenating to an existing string probably causes it to be re-allocated and copied, which I think negates any benefit gained from not doing the conversion to list up-front. &lt;/p&gt;
&lt;p&gt;def comma (data):&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;seq = list(data)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;end = &amp;quot;&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if len(seq) &amp;gt; 1:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;end = &amp;quot; and &amp;quot; + seq.pop ()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return &amp;quot;{%s%s}&amp;quot; % (&amp;quot;, &amp;quot;.join (seq), end)&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551496</link><pubDate>Thu, 16 Apr 2009 00:14:11 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551496</guid><dc:creator>Steve Cooper</dc:creator><description>&lt;P&gt;Here's mine in python, along with the matching problem statement. &lt;/P&gt;
&lt;P&gt;to iterate with oxford commas, we follow these rules;&lt;/P&gt;
&lt;P&gt;A) Every item except the last two is followed by a comma and space&lt;BR&gt;B) The penultimate item is spearated by ' and '&lt;BR&gt;C) The last item stands alone.&lt;/P&gt;
&lt;P&gt;Here's the python;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp;def noOxfordComma(sequence):&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;queue = []&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result = ""&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for item in sequence:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;queue.append(item)&lt;BR&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if len(queue) &amp;gt; 2: result = result + queue.pop() + ", "&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if len(queue) == 2: result = result + queue.pop() + " and "&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if len(queue) == 1: result = result + queue.pop()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return "{" + result + "}"&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551510</link><pubDate>Thu, 16 Apr 2009 00:18:21 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551510</guid><dc:creator>RJ</dc:creator><description>&lt;p&gt;Not as elegant as some of the other solutions but I will still post it.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//We need to create comma separated list but with a twist.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//The last word will have AND in front of it instead of a comma. &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//To achieve this, we will create a new list from the original list &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//while putting , in front of each word, except for the first word.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//For the last word, we will replace comma with AND.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static string JoinWords2(IEnumerable&amp;lt;string&amp;gt; words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;string&amp;gt; output = new List&amp;lt;string&amp;gt;();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string word in words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string separator = output.Count == 0 ? string.Empty : &amp;quot;, &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output.Add(separator + word);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(output.Count &amp;gt; 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string lastWord = output[output.Count - 1].Substring(2); //SUBSTRING will get rid of the &amp;quot;, &amp;quot; in front of the actual word.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output[output.Count - 1] = &amp;quot; AND &amp;quot; + lastWord; //And we will prepend the word with AND. &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//We are not doing search and replace on &amp;quot;,&amp;quot; because the last word could very well be &amp;quot;,&amp;quot; and &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//search replace will break it.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return string.Format(&amp;quot;{{{0}}}&amp;quot;, string.Join(string.Empty, output.ToArray()));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551520</link><pubDate>Thu, 16 Apr 2009 00:24:23 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551520</guid><dc:creator>Vasu</dc:creator><description>&lt;p&gt;My earlier solution didnt handle all the scenarios.&lt;/p&gt;
&lt;p&gt;public static void Format(string pSomeText, IEnumerable&amp;lt;string&amp;gt; pStrings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var x = pStrings&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Reverse()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Skip(1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Reverse()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.DefaultIfEmpty()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Aggregate((a, b) =&amp;gt; a += &amp;quot;, &amp;quot; + b);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var y = String.Concat(x,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (pStrings.Count() &amp;gt; 1 ? &amp;quot; And &amp;quot; : &amp;quot;&amp;quot;),&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pStrings.DefaultIfEmpty().Last());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(String.Format(&amp;quot;{0} -&amp;gt; {{ {1} }}&amp;quot;, pSomeText, y));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; Format(&amp;quot;Empty Sequence&amp;quot;, new List&amp;lt;string&amp;gt; { });&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; Format(&amp;quot;Single Item&amp;quot;, new List&amp;lt;string&amp;gt; { &amp;quot;ABC&amp;quot; });&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; Format(&amp;quot;Two Items&amp;quot;, new List&amp;lt;string&amp;gt; { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; });&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; Format(&amp;quot;&amp;gt; 2 Items&amp;quot;, new List&amp;lt;string&amp;gt; { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; });&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551528</link><pubDate>Thu, 16 Apr 2009 00:27:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551528</guid><dc:creator>Konstantin Balashov</dc:creator><description>&lt;p&gt;// please read carefully very important comment in the next line&lt;/p&gt;
&lt;p&gt;// :)&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;using System.IO;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Linq;&lt;/p&gt;
&lt;p&gt;namespace xTry {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;class MainClass {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static string delimiter;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static void Main()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TestConcat(new string[]{}, &amp;quot;{}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TestConcat(new []{&amp;quot;ABC&amp;quot;}, &amp;quot;{ABC}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TestConcat(new []{&amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;}, &amp;quot;{ABC and DEF}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TestConcat(new []{&amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot;}, &amp;quot;{ABC, DEF, G and H}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void TestConcat(IEnumerable&amp;lt;string&amp;gt; strings, string expected)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var value = Concat(strings);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(&amp;quot;{0} == {1} =&amp;gt; {2}&amp;quot;, expected, value, expected == value);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string Concat(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string res = &amp;quot;&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;delimiter=&amp;quot; and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(strings.Count()&amp;gt;0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;res=strings.Reverse().Aggregate((workingSentence, next) =&amp;gt; next + GetDelimiter() + workingSentence);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot;+res+&amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static string GetDelimiter()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string tmp=delimiter;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;delimiter=&amp;quot;, &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return tmp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551537</link><pubDate>Thu, 16 Apr 2009 00:33:38 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551537</guid><dc:creator>Rik Hemsley</dc:creator><description>&lt;p&gt;I don't see any Ruby here. This is unacceptable. And where are everyone's tests?&lt;/p&gt;
&lt;p&gt;module Enumerable&lt;/p&gt;
&lt;p&gt;	def bracketed_english_join&lt;/p&gt;
&lt;p&gt;		out = inject([]) { |array, item| array + [item, ', '] }&lt;/p&gt;
&lt;p&gt;		'{' +&lt;/p&gt;
&lt;p&gt;			case out.length&lt;/p&gt;
&lt;p&gt;				when 0 then ''&lt;/p&gt;
&lt;p&gt;				when 2 then out[0]&lt;/p&gt;
&lt;p&gt;				else (&lt;/p&gt;
&lt;p&gt;					out[out.length - 3] = ' and ';&lt;/p&gt;
&lt;p&gt;					out[0, out.length - 1].join&lt;/p&gt;
&lt;p&gt;				)&lt;/p&gt;
&lt;p&gt;			end +&lt;/p&gt;
&lt;p&gt;		'}'&lt;/p&gt;
&lt;p&gt;	end&lt;/p&gt;
&lt;p&gt;end&lt;/p&gt;
&lt;p&gt;if __FILE__ == $0&lt;/p&gt;
&lt;p&gt;	require 'test/unit'&lt;/p&gt;
&lt;p&gt;	class BracketedEnglishJoinTestCase &amp;lt; Test::Unit::TestCase&lt;/p&gt;
&lt;p&gt;		def test_empty_returns_empty_string&lt;/p&gt;
&lt;p&gt;			assert_equal('{}', [].bracketed_english_join)&lt;/p&gt;
&lt;p&gt;		end&lt;/p&gt;
&lt;p&gt;		def test_single_returns_item_only&lt;/p&gt;
&lt;p&gt;			assert_equal(&lt;/p&gt;
&lt;p&gt;				'{ABC}',&lt;/p&gt;
&lt;p&gt;				['ABC'].bracketed_english_join&lt;/p&gt;
&lt;p&gt;			)&lt;/p&gt;
&lt;p&gt;		end&lt;/p&gt;
&lt;p&gt;		def test_dual_returns_and_separated&lt;/p&gt;
&lt;p&gt;			assert_equal(&lt;/p&gt;
&lt;p&gt;				'{ABC and DEF}',&lt;/p&gt;
&lt;p&gt;				['ABC', 'DEF'].bracketed_english_join&lt;/p&gt;
&lt;p&gt;			)&lt;/p&gt;
&lt;p&gt;		end&lt;/p&gt;
&lt;p&gt;		def test_many_returns_comma_then_and_separated&lt;/p&gt;
&lt;p&gt;			assert_equal(&lt;/p&gt;
&lt;p&gt;				'{ABC, DEF, G and H}',&lt;/p&gt;
&lt;p&gt;				['ABC', 'DEF', 'G', 'H'].bracketed_english_join&lt;/p&gt;
&lt;p&gt;			)&lt;/p&gt;
&lt;p&gt;		end&lt;/p&gt;
&lt;p&gt;	end&lt;/p&gt;
&lt;p&gt;end&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551538</link><pubDate>Thu, 16 Apr 2009 00:34:22 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551538</guid><dc:creator>Konstantin Balashov</dc:creator><description>&lt;p&gt;Oops, Fernando Nicolet already put together something very similar :(&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551539</link><pubDate>Thu, 16 Apr 2009 00:34:43 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551539</guid><dc:creator>RJ</dc:creator><description>&lt;p&gt;Great solutions. But If I have to pick one for readability alone (ignoring efficiency), I will pick Oliver's solution. His code is shortest and crystal clear in what it does.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551569</link><pubDate>Thu, 16 Apr 2009 00:50:06 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551569</guid><dc:creator>Iliya Trendafilov</dc:creator><description>&lt;p&gt;-- Haskell one pass solution&lt;/p&gt;
&lt;p&gt;--&lt;/p&gt;
&lt;p&gt;-- Problem restatement (skipping empty and one word case)&lt;/p&gt;
&lt;p&gt;-- *) first word is alone&lt;/p&gt;
&lt;p&gt;-- *) last word has &amp;quot; and &amp;quot; prefix&lt;/p&gt;
&lt;p&gt;-- *) every other word has &amp;quot;, &amp;quot; prefix&lt;/p&gt;
&lt;p&gt;--&lt;/p&gt;
&lt;p&gt;-- Tail recursion optimization should be possible and stack space shouldn't be a problem&lt;/p&gt;
&lt;p&gt;quibbler :: [String] -&amp;gt; String&lt;/p&gt;
&lt;p&gt;quibbler words = &amp;quot;{&amp;quot; ++ (quibHelper words True) ++ &amp;quot;}&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;where &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;quibHelper :: [String] -&amp;gt; Bool -&amp;gt; String -- where the Bool == True iff the function is called for the first time&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;quibHelper [] True = &amp;quot;&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;quibHelper [] False = undefined -- kind of like assert&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;quibHelper [onlyWord] True = onlyWord&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;quibHelper [lastWord] False = &amp;quot; and &amp;quot; ++ lastWord&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;quibHelper (x:xs) True = x ++ (quibHelper xs False)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;quibHelper (x:xs) False = &amp;quot;, &amp;quot; ++ x ++ (quibHelper xs False)&lt;/p&gt;
&lt;p&gt;-- my Haskell-fu is weak, I'm sure one can do better than that&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551572</link><pubDate>Thu, 16 Apr 2009 00:52:04 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551572</guid><dc:creator>Joren</dc:creator><description>&lt;p&gt;Just for laughs, a Mathematica solution using pattern matching. Used like Foo[{&amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot;}]&lt;/p&gt;
&lt;p&gt;Foo[strings_] := StringJoin[&amp;quot;{&amp;quot;, strings, &amp;quot;}&amp;quot;]&lt;/p&gt;
&lt;p&gt;Foo[{most__, last_}] := StringJoin[&amp;quot;{&amp;quot;, Riffle[{most}, &amp;quot;, &amp;quot;], &amp;quot; and &amp;quot;, last, &amp;quot;}&amp;quot;]&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551581</link><pubDate>Thu, 16 Apr 2009 00:53:56 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551581</guid><dc:creator>Eric W. Bachtal</dc:creator><description>&lt;p&gt;Wish I had time to read all the submissions. &amp;nbsp;Some really interesting ones, particular the use of a queue (wish I'd thought of that). &amp;nbsp;Anyhow, here's another compact explicit one-pass .NET 2.0-compat entry with a slight twist in that it retains and relies on the last item's position in the string for post-enum patch-up. &amp;nbsp;Seems clear to me. :)&lt;/p&gt;
&lt;p&gt;static string LippertJoin(IEnumerable&amp;lt;string&amp;gt; items) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp;StringBuilder sblist = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp;int lastItemPos = -1;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;foreach (string item in items) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;lastItemPos = sblist.Length;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;sblist.Append(item + &amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;string list = sblist.ToString(0, ((lastItemPos == -1) ? 0 : sblist.Length - 2));&lt;/p&gt;
&lt;p&gt; &amp;nbsp;if (lastItemPos &amp;gt; 0) &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;list = list.Substring(0, lastItemPos - 2) + &amp;quot; and &amp;quot; + list.Substring(lastItemPos);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;return &amp;quot;{&amp;quot; + list + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551589</link><pubDate>Thu, 16 Apr 2009 00:58:28 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551589</guid><dc:creator>Dave</dc:creator><description>&lt;p&gt;A Javascript solution (assuming an Array input) so Eric won't forget his roots:&lt;/p&gt;
&lt;p&gt;function makeList(array)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;	var a = array.concat(), last = a.pop() || &amp;quot;&amp;quot;;&lt;/p&gt;
&lt;p&gt;	return &amp;quot;&amp;quot;.concat(&lt;/p&gt;
&lt;p&gt;		&amp;quot;{&amp;quot;, a.length? a.join(&amp;quot;, &amp;quot;)+&amp;quot; and &amp;quot; : &amp;quot;&amp;quot;, last, &amp;quot;}&amp;quot;&lt;/p&gt;
&lt;p&gt;	);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Sure it could be made longer and clearer, but where's the fun in that?&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551590</link><pubDate>Thu, 16 Apr 2009 00:58:35 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551590</guid><dc:creator>Iliya Trendafilov</dc:creator><description>&lt;p&gt;Actually, the last two code lines should have been: &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;quibHelper (firstWord:words) True = firstWord ++ (quibHelper words False)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;quibHelper (middleWord:words) False = &amp;quot;, &amp;quot; ++ middleWord ++ (quibHelper words False)&lt;/p&gt;
&lt;p&gt;(indeed, better named variables convey intention better)&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551597</link><pubDate>Thu, 16 Apr 2009 01:00:57 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551597</guid><dc:creator>Simon Gillbee</dc:creator><description>&lt;p&gt;I have two. Once is pretty readable, but does not scale to huge lists. The other uses straight enumeration and doesn't take a local copy.&lt;/p&gt;
&lt;p&gt;		[Test]&lt;/p&gt;
&lt;p&gt;		public void TestConvertToList()&lt;/p&gt;
&lt;p&gt;		{&lt;/p&gt;
&lt;p&gt;			var input1 = new string[] { };&lt;/p&gt;
&lt;p&gt;			var input2 = new string[] { &amp;quot;ABC&amp;quot; };&lt;/p&gt;
&lt;p&gt;			var input3 = new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; };&lt;/p&gt;
&lt;p&gt;			var input4 = new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; };&lt;/p&gt;
&lt;p&gt;			var expectedOutput1 = &amp;quot;{}&amp;quot;;&lt;/p&gt;
&lt;p&gt;			var expectedOutput2 = &amp;quot;{ABC}&amp;quot;;&lt;/p&gt;
&lt;p&gt;			var expectedOutput3 = &amp;quot;{ABC and DEF}&amp;quot;;&lt;/p&gt;
&lt;p&gt;			var expectedOutput4 = &amp;quot;{ABC, DEF, G and H}&amp;quot;;&lt;/p&gt;
&lt;p&gt;			Assert.AreEqual(expectedOutput1, ConvertToBracedEnglishSentence_Readable(input1));&lt;/p&gt;
&lt;p&gt;			Assert.AreEqual(expectedOutput2, ConvertToBracedEnglishSentence_Readable(input2));&lt;/p&gt;
&lt;p&gt;			Assert.AreEqual(expectedOutput3, ConvertToBracedEnglishSentence_Readable(input3));&lt;/p&gt;
&lt;p&gt;			Assert.AreEqual(expectedOutput4, ConvertToBracedEnglishSentence_Readable(input4));&lt;/p&gt;
&lt;p&gt;			Assert.AreEqual(expectedOutput1, ConvertToBracedEnglishSentence_EfficientForLargeLists(input1));&lt;/p&gt;
&lt;p&gt;			Assert.AreEqual(expectedOutput2, ConvertToBracedEnglishSentence_EfficientForLargeLists(input2));&lt;/p&gt;
&lt;p&gt;			Assert.AreEqual(expectedOutput3, ConvertToBracedEnglishSentence_EfficientForLargeLists(input3));&lt;/p&gt;
&lt;p&gt;			Assert.AreEqual(expectedOutput4, ConvertToBracedEnglishSentence_EfficientForLargeLists(input4));&lt;/p&gt;
&lt;p&gt;		}&lt;/p&gt;
&lt;p&gt;		/// &amp;lt;summary&amp;gt;&lt;/p&gt;
&lt;p&gt;		/// This method assumes that the input collection is not huge.&lt;/p&gt;
&lt;p&gt;		/// If it is huge, creating a local copy of the collection&lt;/p&gt;
&lt;p&gt;		/// will cost time and memory.&lt;/p&gt;
&lt;p&gt;		/// This method is very readable.&lt;/p&gt;
&lt;p&gt;		/// &amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;		/// &amp;lt;param name=&amp;quot;inputCollection&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/p&gt;
&lt;p&gt;		/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/p&gt;
&lt;p&gt;		private static string ConvertToBracedEnglishSentence_Readable(IEnumerable&amp;lt;string&amp;gt; inputCollection)&lt;/p&gt;
&lt;p&gt;		{&lt;/p&gt;
&lt;p&gt;			// Convert to fixed list so that we know the count&lt;/p&gt;
&lt;p&gt;			List&amp;lt;string&amp;gt; items = new List&amp;lt;string&amp;gt;(inputCollection);&lt;/p&gt;
&lt;p&gt;			StringBuilder sentence = new StringBuilder();&lt;/p&gt;
&lt;p&gt;			for (int i = 0; i &amp;lt; items.Count; i++)&lt;/p&gt;
&lt;p&gt;			{&lt;/p&gt;
&lt;p&gt;				// All items except the last two&lt;/p&gt;
&lt;p&gt;				if (i &amp;lt; items.Count - 2)&lt;/p&gt;
&lt;p&gt;				{&lt;/p&gt;
&lt;p&gt;					sentence.AppendFormat(&amp;quot;{0}, &amp;quot;, items[i]);&lt;/p&gt;
&lt;p&gt;				}&lt;/p&gt;
&lt;p&gt;				// The second to last item&lt;/p&gt;
&lt;p&gt;				else if (i == items.Count - 2)&lt;/p&gt;
&lt;p&gt;				{&lt;/p&gt;
&lt;p&gt;					sentence.AppendFormat(&amp;quot;{0} and &amp;quot;, items[i]);&lt;/p&gt;
&lt;p&gt;				}&lt;/p&gt;
&lt;p&gt;				// The last item&lt;/p&gt;
&lt;p&gt;				else&lt;/p&gt;
&lt;p&gt;				{&lt;/p&gt;
&lt;p&gt;					sentence.Append(items[i]);&lt;/p&gt;
&lt;p&gt;				}&lt;/p&gt;
&lt;p&gt;			}&lt;/p&gt;
&lt;p&gt;			// Add the braces around the result&lt;/p&gt;
&lt;p&gt;			return string.Format(&amp;quot;{{{0}}}&amp;quot;, sentence.ToString());&lt;/p&gt;
&lt;p&gt;		}&lt;/p&gt;
&lt;p&gt;		/// &amp;lt;summary&amp;gt;&lt;/p&gt;
&lt;p&gt;		/// This method does not require a local copy of the input&lt;/p&gt;
&lt;p&gt;		/// collection. That should make it faster and less&lt;/p&gt;
&lt;p&gt;		/// memory hungry for large input lists.&lt;/p&gt;
&lt;p&gt;		/// It is a but less readable, but still fairly clear:&lt;/p&gt;
&lt;p&gt;		/// &amp;nbsp; Start with the open brace &amp;quot;{&amp;quot; then&lt;/p&gt;
&lt;p&gt;		/// &amp;nbsp; For each item in the inputCollection,&lt;/p&gt;
&lt;p&gt;		/// &amp;nbsp; if it's not the first item, append &amp;quot;, &amp;quot; (and remember where we put it), then&lt;/p&gt;
&lt;p&gt;		/// &amp;nbsp; append the item to the sentence.&lt;/p&gt;
&lt;p&gt;		/// &amp;nbsp; After all items have been added, add the closing brace &amp;quot;}&amp;quot;&lt;/p&gt;
&lt;p&gt;		/// &amp;nbsp; If we inserted a comma, replace the last one with &amp;quot; and &amp;quot;.&lt;/p&gt;
&lt;p&gt;		/// &amp;nbsp; Then return the sentence surrounded by braces.&lt;/p&gt;
&lt;p&gt;		/// &amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;		/// &amp;lt;param name=&amp;quot;inputCollection&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/p&gt;
&lt;p&gt;		/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/p&gt;
&lt;p&gt;		private static string ConvertToBracedEnglishSentence_EfficientForLargeLists(IEnumerable&amp;lt;string&amp;gt; inputCollection)&lt;/p&gt;
&lt;p&gt;		{&lt;/p&gt;
&lt;p&gt;			int indexOfLastCommaInsert = -1;&lt;/p&gt;
&lt;p&gt;			bool firstItem = true;&lt;/p&gt;
&lt;p&gt;			StringBuilder sentence = new StringBuilder();&lt;/p&gt;
&lt;p&gt;			sentence.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt;			foreach (string item in inputCollection)&lt;/p&gt;
&lt;p&gt;			{&lt;/p&gt;
&lt;p&gt;				if (!firstItem)&lt;/p&gt;
&lt;p&gt;				{&lt;/p&gt;
&lt;p&gt;					indexOfLastCommaInsert = sentence.Length;&lt;/p&gt;
&lt;p&gt;					sentence.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt;				}&lt;/p&gt;
&lt;p&gt;				firstItem = false;&lt;/p&gt;
&lt;p&gt;				sentence.Append(item);&lt;/p&gt;
&lt;p&gt;			}&lt;/p&gt;
&lt;p&gt;			sentence.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt;			if (indexOfLastCommaInsert &amp;gt;= 0)&lt;/p&gt;
&lt;p&gt;			{&lt;/p&gt;
&lt;p&gt;				sentence.Replace(&amp;quot;, &amp;quot;, &amp;quot; and &amp;quot;, indexOfLastCommaInsert, 2);&lt;/p&gt;
&lt;p&gt;			}&lt;/p&gt;
&lt;p&gt;			return sentence.ToString();&lt;/p&gt;
&lt;p&gt;		}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551602</link><pubDate>Thu, 16 Apr 2009 01:03:35 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551602</guid><dc:creator>Yoav Zobel</dc:creator><description>&lt;p&gt;Thanks for great posts, Eric!&lt;/p&gt;
&lt;p&gt;As I saw this question, I came up with all kinds of efficient solutions, but variants of them have already been posted here.&lt;/p&gt;
&lt;p&gt;So I tried to think of the most unusual solution in C# that no one else would think of.&lt;/p&gt;
&lt;p&gt;My solution is inefficient and cryptic, it's presented only as a mind game, and of course I would never write this kind of code in my projects. Nevertheless - it is very cool (it's recursive!). See if you can understand why and how it works:&lt;/p&gt;
&lt;p&gt;private static string JoinWords(IEnumerable&amp;lt;string&amp;gt; e)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;IEnumerator&amp;lt;string&amp;gt; en = e.GetEnumerator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;en.Reset();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;string dummy;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + (en.MoveNext() ? JoinRecursive(en, out dummy) : string.Empty) + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;private static string JoinRecursive(IEnumerator&amp;lt;string&amp;gt; en, out string sep)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;string result = en.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (en.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string rest = JoinRecursive(en, out sep);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result += sep + rest;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sep = &amp;quot;, &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sep = &amp;quot; and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return result;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551608</link><pubDate>Thu, 16 Apr 2009 01:06:06 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551608</guid><dc:creator>Sean Kerwin</dc:creator><description>&lt;p&gt;My serious attempt looked much like Olivier's, except with a &amp;quot;l.Take(l.Count() - 1)&amp;quot; in place of GetRange( ), which is probably inferior. &amp;nbsp;Then I started looking for the tersest possible solution. &amp;nbsp;I haven't been able to top this:&lt;/p&gt;
&lt;p&gt;public string NOxfordComma_Silly(IEnumerable&amp;lt;string&amp;gt; l)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;var i = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + l.Reverse().Aggregate(&amp;quot;&amp;quot;, (a, b) =&amp;gt; b + new[] {&amp;quot;&amp;quot;, &amp;quot; and &amp;quot;, &amp;quot;, &amp;quot;}[Math.Min(i++, 2)] + a) + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Obviously pretty crummy from an efficiency and readability standpoint, but it's always fun to find perverse misuses for the LINQ extension methods. :)&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551614</link><pubDate>Thu, 16 Apr 2009 01:07:33 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551614</guid><dc:creator>David</dc:creator><description>&lt;p&gt;Haskell:&lt;/p&gt;
&lt;p&gt;format :: [String] -&amp;gt; String&lt;/p&gt;
&lt;p&gt;format l = &amp;quot;{&amp;quot;++(sep l)++&amp;quot;}&amp;quot; where&lt;/p&gt;
&lt;p&gt; &amp;nbsp;sep [] = &amp;quot;&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;sep [a] = a&lt;/p&gt;
&lt;p&gt; &amp;nbsp;sep [a,b] = a++&amp;quot; and &amp;quot;++b&lt;/p&gt;
&lt;p&gt; &amp;nbsp;sep (a:l) = a++&amp;quot;, &amp;quot;++(sep l)&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551624</link><pubDate>Thu, 16 Apr 2009 01:09:54 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551624</guid><dc:creator>Nick</dc:creator><description>&lt;p&gt;Some interesting solutions here, but nothing worthy of enterprise production code. &amp;nbsp;What's the deal... I don't even see any factories or XML!&lt;/p&gt;
&lt;p&gt;Admittedly I don't have a lot of time, but here's my first pass at a real enterprise solution. &amp;nbsp;I'll add an XML-serving web service later. Should work with VS2008/.NET 3.5.&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Linq;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;namespace Scratch&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;class Program&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[] input = { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(EnumerableStringFormatter.FormatInput(input));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;class EnumerableStringFormatter&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string FormatInput(IEnumerable&amp;lt;string&amp;gt; input)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var words = new List&amp;lt;string&amp;gt;();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var separators = new List&amp;lt;string&amp;gt;();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var pairs = new List&amp;lt;WordFactory.WordSeparatorPair&amp;gt;();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// get words&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (var word in WordFactory.GetWord(input))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words.Add(word);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// get separators&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (var separator in WordFactory.GetSeparator(input))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;separators.Add(separator);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// combine them&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; words.Count; i++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pairs.Add(new WordFactory.WordSeparatorPair(words[i], separators[i]));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// convert to a string&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (var pair in pairs)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(String.Format(&amp;quot;{0}{1}&amp;quot;, pair.Separator, pair.Word));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.Append(&amp;quot;}&amp;quot;).ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;class WordFactory&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static IEnumerable&amp;lt;string&amp;gt; GetWord(IEnumerable&amp;lt;string&amp;gt; input)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (var s in input)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return s;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static IEnumerable&amp;lt;string&amp;gt; GetSeparator(IEnumerable&amp;lt;string&amp;gt; input)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return &amp;quot;&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var a = input.Skip(1).TakeWhile(s =&amp;gt; s != input.Last());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (var s in a)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return &amp;quot;, &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return &amp;quot; and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public class WordSeparatorPair&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private string _word;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private string _separator;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public string Word { get { return _word; } }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public string Separator { get { return _separator; } }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public WordSeparatorPair(string word, string separator)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;_word = word;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;_separator = separator;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;PS: I'm really not as familiar with LINQ as I'd like to be, so there are probably better^Wworse ways to do this.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551633</link><pubDate>Thu, 16 Apr 2009 01:11:51 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551633</guid><dc:creator>Nick</dc:creator><description>&lt;p&gt;PPS: For what it's worth, here was my first blind attempt at solving the problem. &amp;nbsp;As with others, I usually prefer a simple and straightforward solution compared to a clever shorter one. &amp;nbsp;(However, I do enjoy reading sneaky clever code -- just not at work).&lt;/p&gt;
&lt;p&gt;static string FormatEnumerableStrings(IEnumerable&amp;lt;string&amp;gt; input) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;var sb = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;var strings = input.ToList();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int count = strings.Count;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (count &amp;gt; 0) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(strings[0]);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 1; i &amp;lt; count - 1; i++) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(strings[i]);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (count &amp;gt; 1) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(strings[count - 1]);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return sb.Append(&amp;quot;}&amp;quot;).ToString();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551637</link><pubDate>Thu, 16 Apr 2009 01:13:32 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551637</guid><dc:creator>Aaron Whitney</dc:creator><description>&lt;p&gt;I went for as terse as possible with Linq. I don't preserve the order, but I don't think that was a requirement. It is also fairly effecient as it only revisits the first couple items.&lt;/p&gt;
&lt;p&gt;static string FormatStrings(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp;return string.Format(&amp;quot;{{{0}}}&amp;quot;, string.Concat(&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;strings.Skip(2).Select((x) =&amp;gt; x + &amp;quot;, &amp;quot;).Concat(&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;strings.Skip(1).Take(1).Select((y) =&amp;gt; y + &amp;quot; and &amp;quot;)).Concat(&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;strings.Take(1).Select((z) =&amp;gt; z)).ToArray()));&lt;/p&gt;
&lt;p&gt;}//method&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551705</link><pubDate>Thu, 16 Apr 2009 01:53:50 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551705</guid><dc:creator>Aaron Whitney</dc:creator><description>&lt;p&gt;I realized that given the rules the order probably does matter, in which case this version, which is much less efficient but almost equally terse, works.&lt;/p&gt;
&lt;p&gt;static string FormatStrings(IEnumerable&amp;lt;string&amp;gt; input)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;var reordered = input.Reverse().Take(2).Concat(input.Reverse().Skip(2).Reverse());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return string.Format(&amp;quot;{{{0}}}&amp;quot;, string.Concat(&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;reordered.Skip(2).Select((x) =&amp;gt; x + &amp;quot;, &amp;quot;).Concat(&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;reordered.Skip(1).Take(1).Select((y) =&amp;gt; y + &amp;quot; and &amp;quot;)).Concat(&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;reordered.Take(1).Select((z) =&amp;gt; z)).ToArray()));&lt;/p&gt;
&lt;p&gt;}//method&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551719</link><pubDate>Thu, 16 Apr 2009 01:57:44 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551719</guid><dc:creator>dahlbyk</dc:creator><description>&lt;p&gt;Minor correction for Hristo's F# pattern matching solution, which breaks for lists of odd length &amp;gt; 1:&lt;/p&gt;
&lt;p&gt;let format (words : list&amp;lt;string&amp;gt;) =&lt;/p&gt;
&lt;p&gt; &amp;nbsp; let rec makeList (words : list&amp;lt;string&amp;gt;) =&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; match words with&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | [] -&amp;gt; &amp;quot;&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | first :: [] -&amp;gt; first&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | first :: second :: [] -&amp;gt; first + &amp;quot; and &amp;quot; + second&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | first :: rest -&amp;gt; first + &amp;quot;, &amp;quot; + (makeList rest)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;quot;{&amp;quot; + (makeList words) + &amp;quot;}&amp;quot;&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551734</link><pubDate>Thu, 16 Apr 2009 02:03:03 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551734</guid><dc:creator>Claudiu</dc:creator><description>&lt;p&gt;Haskell. It practically reads like the problem statement! I guess it does assume you are using arrays. I don't know how to do enums yet, I'll try later maybe.&lt;/p&gt;
&lt;p&gt;inner :: [String] -&amp;gt; String&lt;/p&gt;
&lt;p&gt;inner [] = &amp;quot;&amp;quot;&lt;/p&gt;
&lt;p&gt;inner [a] = a&lt;/p&gt;
&lt;p&gt;inner [a,b] = a ++ &amp;quot; and &amp;quot; ++ b&lt;/p&gt;
&lt;p&gt;inner (a:rest) = a ++ &amp;quot;, &amp;quot; ++ inner rest&lt;/p&gt;
&lt;p&gt;formatString :: [String] -&amp;gt; String&lt;/p&gt;
&lt;p&gt;formatString a = &amp;quot;{&amp;quot; ++ inner a ++ &amp;quot;}&amp;quot;&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551749</link><pubDate>Thu, 16 Apr 2009 02:13:35 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551749</guid><dc:creator>Mohannad</dc:creator><description>&lt;p&gt;My solution:&lt;/p&gt;
&lt;p&gt;static string Join(IEnumerable&amp;lt;string&amp;gt; words)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;StringBuilder buffer = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;buffer.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;bool isFirst = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int counter = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int count = words.Count(x =&amp;gt; true);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;foreach (string word in words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (isFirst)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;buffer.Append(&amp;quot; &amp;quot; + word);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if (counter == count - 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;buffer.Append(&amp;quot; and &amp;quot; + word);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;buffer.Append(&amp;quot;, &amp;quot; + word);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;isFirst = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;counter++;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;buffer.Append(&amp;quot; }&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return buffer.ToString();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Console.WriteLine(Join(new string[] { }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Console.WriteLine(Join(new string[] { &amp;quot;ds&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Console.WriteLine(Join(new string[] { &amp;quot;ds&amp;quot;, &amp;quot;sdf&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Console.WriteLine(Join(new string[] { &amp;quot;ds&amp;quot;, &amp;quot;sdf&amp;quot;, &amp;quot;sdfs&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Console.WriteLine(Join(new string[] { &amp;quot;ds&amp;quot;, &amp;quot;sdf&amp;quot;, &amp;quot;sdfs&amp;quot;, &amp;quot;rty&amp;quot; }));&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551761</link><pubDate>Thu, 16 Apr 2009 02:17:55 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551761</guid><dc:creator>shahriarhaque</dc:creator><description>&lt;p&gt;My solution in Java:&lt;/p&gt;
&lt;p&gt;	public static void main(String[] args) {&lt;/p&gt;
&lt;p&gt;		ArrayList&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;String&amp;gt;();&lt;/p&gt;
&lt;p&gt;		list.add(&amp;quot;ABC&amp;quot;);&lt;/p&gt;
&lt;p&gt;		list.add(&amp;quot;DEF&amp;quot;);&lt;/p&gt;
&lt;p&gt;		list.add(&amp;quot;GHI&amp;quot;);&lt;/p&gt;
&lt;p&gt;		list.add(&amp;quot;JKL&amp;quot;);&lt;/p&gt;
&lt;p&gt;		Iterator&amp;lt;String&amp;gt; it = list.iterator();&lt;/p&gt;
&lt;p&gt;		System.out.println(&amp;quot;{&amp;quot; + print(it,false).replace(&amp;quot;, and&amp;quot;, &amp;quot; and&amp;quot;) + &amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;	private static String print(Iterator&amp;lt;String&amp;gt; iter, boolean nonFirst) {&lt;/p&gt;
&lt;p&gt;		if(iter.hasNext()){&lt;/p&gt;
&lt;p&gt;			String curr1 = iter.next();&lt;/p&gt;
&lt;p&gt;			if(!iter.hasNext()) return (nonFirst?&amp;quot; and &amp;quot;:&amp;quot;&amp;quot;) + curr1;&lt;/p&gt;
&lt;p&gt;			else return curr1 + &amp;quot;,&amp;quot; + print(iter, true);&lt;/p&gt;
&lt;p&gt;		}&lt;/p&gt;
&lt;p&gt;		return &amp;quot;&amp;quot;;	&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551772</link><pubDate>Thu, 16 Apr 2009 02:22:43 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551772</guid><dc:creator>Stephen Edmonds</dc:creator><description>&lt;p&gt;Here is a perl solution (with tests):&lt;/p&gt;
&lt;p&gt;#!/net/bin/perl&lt;/p&gt;
&lt;p&gt;use strict;&lt;/p&gt;
&lt;p&gt;use warnings;&lt;/p&gt;
&lt;p&gt;use Test::More 'tests' =&amp;gt; 4;&lt;/p&gt;
&lt;p&gt;is(&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;concat(),&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;'{}',&lt;/p&gt;
&lt;p&gt;);&lt;/p&gt;
&lt;p&gt;is(&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;concat('ABC'),&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;'{ABC}',&lt;/p&gt;
&lt;p&gt;);&lt;/p&gt;
&lt;p&gt;is(&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;concat('ABC', 'DEF'),&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;'{ABC and DEF}',&lt;/p&gt;
&lt;p&gt;);&lt;/p&gt;
&lt;p&gt;is(&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;concat('ABC', 'DEF', 'G', 'H'),&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;'{ABC, DEF, G and H}',&lt;/p&gt;
&lt;p&gt;);&lt;/p&gt;
&lt;p&gt;exit;&lt;/p&gt;
&lt;p&gt;#################&lt;/p&gt;
&lt;p&gt;sub concat&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;my @parts = @_;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if ( not @parts )&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return '{}';&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if ( scalar @parts &amp;lt; 2 )&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return '{' . $parts[0] . '}';&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;my $last = pop @parts;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return '{' . join( ', ', @parts ) . ' and ' . $last .'}';&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;I wrote this before reading the comments and was pleasantly surprised to see that Olivier Leclant had used the same technique.&lt;/p&gt;
&lt;p&gt;A different version that simply joins with comma and then substitutes the last comma:&lt;/p&gt;
&lt;p&gt;sub concat&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;my $string = join ', ', @_;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;# assuming that parts are just capital ascii letters&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;$string =~ s{ , \s ([A-Z]+) \z }{ and $1}smx;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return '{' . $string . '}';&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;But note the massive assumption of what the data is. &amp;nbsp;&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551773</link><pubDate>Thu, 16 Apr 2009 02:25:07 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551773</guid><dc:creator>Owen</dc:creator><description>&lt;p&gt;One thing I'm seeing a lot of from the imperative side of the room is &amp;quot;where are we in the string?&amp;quot; ifs in a single loop. While I am primarily an imperative programmer, I think this is less elegant than it could be. Consider the following python example:&lt;/p&gt;
&lt;p&gt;def default_head_format(part):&lt;/p&gt;
&lt;p&gt;	return str(part)&lt;/p&gt;
&lt;p&gt;def default_body_format(part):&lt;/p&gt;
&lt;p&gt;	return &amp;quot;, %s&amp;quot; % str(part)&lt;/p&gt;
&lt;p&gt;def default_tail_format(part):&lt;/p&gt;
&lt;p&gt;	return &amp;quot; and %s&amp;quot; % str(part)&lt;/p&gt;
&lt;p&gt;def english_list(sequence,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; head_format=default_head_format,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; body_format=default_body_format,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tail_format=default_tail_format):&lt;/p&gt;
&lt;p&gt;	&amp;quot;&amp;quot;&amp;quot;&lt;/p&gt;
&lt;p&gt;	Converts a sequence (like a list) into an english-language string.&lt;/p&gt;
&lt;p&gt;	(1) If the sequence is empty then the resulting string is &amp;quot;&amp;quot;.&lt;/p&gt;
&lt;p&gt;	(2) If the sequence is a single item &amp;quot;ABC&amp;quot; then the resulting string is &amp;quot;ABC&amp;quot;.&lt;/p&gt;
&lt;p&gt;	(3) If the sequence is the two item sequence &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; then the resulting string is &amp;quot;ABC and DEF&amp;quot;.&lt;/p&gt;
&lt;p&gt;	(4) If the sequence has more than two items, say, &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; then the resulting string is &amp;quot;ABC, DEF, G and H&amp;quot;. (Note: no Oxford comma!)&lt;/p&gt;
&lt;p&gt;	&amp;quot;&amp;quot;&amp;quot;&lt;/p&gt;
&lt;p&gt;	# Split up sequence into three subsequences:&lt;/p&gt;
&lt;p&gt;	# &amp;nbsp;- the sequence containing the first item (head)&lt;/p&gt;
&lt;p&gt;	# &amp;nbsp;- the sequence containing the last item (tail)&lt;/p&gt;
&lt;p&gt;	# &amp;nbsp;- the sequence containing all other items (body)&lt;/p&gt;
&lt;p&gt;	#&lt;/p&gt;
&lt;p&gt;	# Relies on the fact that [][0:1] is [], not an error.&lt;/p&gt;
&lt;p&gt;	head = sequence[0:1]&lt;/p&gt;
&lt;p&gt;	body = sequence[1:-1]&lt;/p&gt;
&lt;p&gt;	tail = sequence[-1:0]&lt;/p&gt;
&lt;p&gt;	return &amp;quot;%s%s%s&amp;quot; % (&lt;/p&gt;
&lt;p&gt;		&amp;quot;&amp;quot;.join(map(head_format, head)),&lt;/p&gt;
&lt;p&gt;		&amp;quot;&amp;quot;.join(map(body_format, body)),&lt;/p&gt;
&lt;p&gt;		&amp;quot;&amp;quot;.join(map(tail_format, tail))&lt;/p&gt;
&lt;p&gt;	)&lt;/p&gt;
&lt;p&gt;Look, ma, no branches! All the conditional logic is handled by breaking up the input list into three (possibly-empty) lists. The &amp;quot;&amp;quot;.join construct is idiomatic python and is (at the time of this writing) much faster than looping and concatenating strings.&lt;/p&gt;
&lt;p&gt;A sample test run:&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; import fabstring&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; fabstring.english_list([])&lt;/p&gt;
&lt;p&gt;''&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; fabstring.english_list([1])&lt;/p&gt;
&lt;p&gt;'1'&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; fabstring.english_list([1,2])&lt;/p&gt;
&lt;p&gt;'1 and 2'&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; fabstring.english_list([1,2,3])&lt;/p&gt;
&lt;p&gt;'1, 2 and 3'&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; fabstring.english_list([1,2,3,4])&lt;/p&gt;
&lt;p&gt;'1, 2, 3 and 4'&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551774</link><pubDate>Thu, 16 Apr 2009 02:25:43 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551774</guid><dc:creator>Stephen Edmonds</dc:creator><description>&lt;p&gt;If you want to run the above perl the #! line should actually be #!/usr/bin/perl. &amp;nbsp;I forgot that the terminal I had open was to a box where we do not use the system perl.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551786</link><pubDate>Thu, 16 Apr 2009 02:32:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551786</guid><dc:creator>Owen</dc:creator><description>&lt;p&gt;Serves me right for not checking that I'd *saved* my code before the last test: there's a bug in that, around the fact that the slice [-1:0] is always empty.&lt;/p&gt;
&lt;p&gt;def english_list(sequence,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; head_format=default_head_format,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; body_format=default_body_format,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tail_format=default_tail_format):&lt;/p&gt;
&lt;p&gt;	&amp;quot;&amp;quot;&amp;quot;&lt;/p&gt;
&lt;p&gt;	Converts a sequence (like a list) into an english-language string.&lt;/p&gt;
&lt;p&gt;	(1) If the sequence is empty then the resulting string is &amp;quot;&amp;quot;.&lt;/p&gt;
&lt;p&gt;	(2) If the sequence is a single item &amp;quot;ABC&amp;quot; then the resulting string is &amp;quot;ABC&amp;quot;.&lt;/p&gt;
&lt;p&gt;	(3) If the sequence is the two item sequence &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; then the resulting string is &amp;quot;ABC and DEF&amp;quot;.&lt;/p&gt;
&lt;p&gt;	(4) If the sequence has more than two items, say, &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; then the resulting string is &amp;quot;ABC, DEF, G and H&amp;quot;. (Note: no Oxford comma!)&lt;/p&gt;
&lt;p&gt;	&amp;quot;&amp;quot;&amp;quot;&lt;/p&gt;
&lt;p&gt;	# If we get a singleton, or an empty list, handle it properly.&lt;/p&gt;
&lt;p&gt;	if len(sequence) &amp;lt;= 1:&lt;/p&gt;
&lt;p&gt;		return &amp;quot;&amp;quot;.join(map(head_format, sequence))&lt;/p&gt;
&lt;p&gt;	# Split up sequence into three subsequences:&lt;/p&gt;
&lt;p&gt;	# &amp;nbsp;- the sequence containing the first item (head)&lt;/p&gt;
&lt;p&gt;	# &amp;nbsp;- the sequence containing the last item (tail)&lt;/p&gt;
&lt;p&gt;	# &amp;nbsp;- the sequence containing all other items (body)&lt;/p&gt;
&lt;p&gt;	#&lt;/p&gt;
&lt;p&gt;	# Relies on the fact that [][0:1] is [], not an error.&lt;/p&gt;
&lt;p&gt;	head = sequence[:1]&lt;/p&gt;
&lt;p&gt;	body = sequence[1:-1]&lt;/p&gt;
&lt;p&gt;	tail = sequence[-1:]&lt;/p&gt;
&lt;p&gt;	return &amp;quot;%s%s%s&amp;quot; % (&lt;/p&gt;
&lt;p&gt;		&amp;quot;&amp;quot;.join(map(head_format, head)),&lt;/p&gt;
&lt;p&gt;		&amp;quot;&amp;quot;.join(map(body_format, body)),&lt;/p&gt;
&lt;p&gt;		&amp;quot;&amp;quot;.join(map(tail_format, tail))&lt;/p&gt;
&lt;p&gt;	)&lt;/p&gt;
&lt;p&gt;is correct.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551787</link><pubDate>Thu, 16 Apr 2009 02:32:53 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551787</guid><dc:creator>don frazier</dc:creator><description>&lt;p&gt;private string StringAte(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder list = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int lastComma = -1;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string comma = string.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string s in strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.AppendFormat(&amp;quot;{0}{1}&amp;quot;, comma, s);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (comma.Length &amp;lt; 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;comma = &amp;quot;, &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;lastComma = list.Length - s.Length - comma.Length;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lastComma &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.Replace(comma, &amp;quot; AND &amp;quot;, lastComma, comma.Length);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return list.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551789</link><pubDate>Thu, 16 Apr 2009 02:32:56 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551789</guid><dc:creator>Wil Peck</dc:creator><description>&lt;p&gt; &amp;nbsp; &amp;nbsp;class Program&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(AppendWords(null));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(AppendWords(string.Empty));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(AppendWords(&amp;quot;ABC&amp;quot;));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(AppendWords(&amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(AppendWords(&amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;GHI&amp;quot;));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.ReadKey();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string AppendWords(params string[] words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (words == null || words.Length == 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder builder = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int counter = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int wordCountToAppend = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;do&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(words[counter]);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;counter++;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;wordCountToAppend = words.Length - counter;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (counter &amp;gt;= 1&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;amp;&amp;amp; wordCountToAppend &amp;gt;= 2)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if (wordCountToAppend == 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} while (counter &amp;lt; words.Length);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return builder.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551815</link><pubDate>Thu, 16 Apr 2009 02:56:55 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551815</guid><dc:creator>Kevin</dc:creator><description>&lt;p&gt;My first idea was a solution a lot like Jon Skeet's. &amp;nbsp;But I ended up with something inspired by my old Perl methods, where arrays acted like stacks, and the differences between nulls and undefineds and empty string were often sort of hand-waved away.&lt;/p&gt;
&lt;p&gt;Restating the problem (parts stolen from Jon):&lt;/p&gt;
&lt;p&gt;1) We always start with &amp;quot;{&amp;quot; and end with &amp;quot;}&amp;quot; (stolen from Jon, of course)&lt;/p&gt;
&lt;p&gt;2) If there's more than one item, join all but the tail item with commas, and append &amp;quot; and &amp;quot; + the tail item. (covers Eric's Cases 3 and 4)&lt;/p&gt;
&lt;p&gt;3) Otherwise, return the zero or one item in the list. &amp;nbsp;(covers Eric's Cases 1 and 2)&lt;/p&gt;
&lt;p&gt;with some reorganizing of code, taking advantage of the fact that an array join on an array with one item does what we want it to do here:&lt;/p&gt;
&lt;p&gt;static string Joiner(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;var stack = new Stack&amp;lt;string&amp;gt;(strings);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;string last = String.Empty, rest = String.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (stack.Count &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;last = stack.Pop();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (stack.Count &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rest = String.Join(&amp;quot;, &amp;quot;, stack.ToArray()) + &amp;quot; and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return '{' + rest + last + '}';&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551817</link><pubDate>Thu, 16 Apr 2009 02:59:14 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551817</guid><dc:creator>Tim Jarvis</dc:creator><description>&lt;p&gt; &amp;nbsp; &amp;nbsp;private string BuildString(IEnumerable&amp;lt;string&amp;gt; list)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;string values = string.Join(&amp;quot;,&amp;quot;, list.ToArray());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;int pos = values.LastIndexOf(',');&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(pos &amp;gt; -1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;values = values.Remove(pos, 1);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;values = values.Insert(pos, &amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(values);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551838</link><pubDate>Thu, 16 Apr 2009 03:13:24 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551838</guid><dc:creator>Tim Jarvis</dc:creator><description>&lt;p&gt;So my solution was to just join the strings with a comma, and then find the last comma and replace it with an &amp;quot; and &amp;quot;. This satisfies the requirements as stated in the original question.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551844</link><pubDate>Thu, 16 Apr 2009 03:16:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551844</guid><dc:creator>Thomas Eyde</dc:creator><description>&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Linq;&lt;/p&gt;
&lt;p&gt;namespace CommaQuibbling&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;internal class Translator&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public string Translate(IEnumerable&amp;lt;string&amp;gt; items)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + Join(items) + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static string Join(IEnumerable&amp;lt;string&amp;gt; items)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var leadingItems = LeadingItemsFrom(items);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var lastItem = LastItemFrom(items);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return JoinLeading(leadingItems) + lastItem;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static IEnumerable&amp;lt;string&amp;gt; LeadingItemsFrom(IEnumerable&amp;lt;string&amp;gt; items)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return items.Reverse().Skip(1).Reverse();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static string LastItemFrom(IEnumerable&amp;lt;string&amp;gt; items)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return items.Reverse().FirstOrDefault();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static string JoinLeading(IEnumerable&amp;lt;string&amp;gt; items)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (items.Any() == false) return &amp;quot;&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return string.Join(&amp;quot;, &amp;quot;, items.ToArray()) + &amp;quot; and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551853</link><pubDate>Thu, 16 Apr 2009 03:29:13 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551853</guid><dc:creator>Travis Simon</dc:creator><description>&lt;p&gt;OK, writing from Australia, which is why I'm so behind everyone else. I haven't looked at other people's solution, and I'm sure I'm just replicating everyone else's code, but here goes:&lt;/p&gt;
&lt;p&gt;/// &amp;lt;summary&amp;gt;&lt;/p&gt;
&lt;p&gt;/// Formats an enumeration of strings using commas as&lt;/p&gt;
&lt;p&gt;/// dictated by English grammar rules. &lt;/p&gt;
&lt;p&gt;/// &amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;/// &amp;lt;example&amp;gt;&lt;/p&gt;
&lt;p&gt;/// {} -&amp;amp;gt; &amp;quot;{}&amp;quot;&lt;/p&gt;
&lt;p&gt;/// {&amp;quot;ABC&amp;quot;} -&amp;amp;gt; &amp;quot;{ABC}&amp;quot;&lt;/p&gt;
&lt;p&gt;/// {&amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;} -&amp;amp;gt; &amp;quot;{ABC and DEF}&amp;quot;&lt;/p&gt;
&lt;p&gt;/// {&amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot;} -&amp;amp;gt; &amp;quot;{ABC, DEF, G and H}&amp;quot;&lt;/p&gt;
&lt;p&gt;/// &amp;lt;/example&amp;gt;&lt;/p&gt;
&lt;p&gt;/// &amp;lt;param name=&amp;quot;strings&amp;quot;&amp;gt;Enumeration of string to join&amp;lt;/param&amp;gt;&lt;/p&gt;
&lt;p&gt;/// &amp;lt;returns&amp;gt;A comma seperated list of the strings with the last&lt;/p&gt;
&lt;p&gt;/// two elements seperated by 'and'&amp;lt;/returns&amp;gt;&lt;/p&gt;
&lt;p&gt;public string EnglishJoin(IEnumerable&amp;lt;string&amp;gt; strings) {&lt;/p&gt;
&lt;p&gt;	Queue&amp;lt;string&amp;gt; stringQueue = new Queue&amp;lt;string&amp;gt;();&lt;/p&gt;
&lt;p&gt;	StringBuilder sb = new StringBuilder();&lt;/p&gt;
&lt;p&gt;	sb.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt;	foreach (string s in strings) {&lt;/p&gt;
&lt;p&gt;		stringQueue.Enqueue(s);&lt;/p&gt;
&lt;p&gt;		if (stringQueue.Count &amp;gt; 2) {&lt;/p&gt;
&lt;p&gt;			sb.Append(stringQueue.Dequeue());&lt;/p&gt;
&lt;p&gt;			sb.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt;		}&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;	// Last two string seperated by ' and '&lt;/p&gt;
&lt;p&gt;	if (stringQueue.Count &amp;gt; 0) {&lt;/p&gt;
&lt;p&gt;		sb.Append(stringQueue.Dequeue());&lt;/p&gt;
&lt;p&gt;		if (stringQueue.Count &amp;gt; 0) {&lt;/p&gt;
&lt;p&gt;			sb.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt;			sb.Append(stringQueue.Dequeue());&lt;/p&gt;
&lt;p&gt;		}&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;	sb.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt;	return sb.ToString();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551854</link><pubDate>Thu, 16 Apr 2009 03:29:33 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551854</guid><dc:creator>Hamed</dc:creator><description>&lt;p&gt;Why not do it backward? Read the enumerable into a stack and build the output keeping an index:&lt;/p&gt;
&lt;p&gt;index == 0 : result = item&lt;/p&gt;
&lt;p&gt;index == 1 : result = item &amp;amp; &amp;quot; and &amp;quot; &amp;amp; result&lt;/p&gt;
&lt;p&gt;index &amp;gt; 1 : result = item &amp;amp; &amp;quot;, &amp;quot; &amp;amp; result&lt;/p&gt;
&lt;p&gt;Actually there is no point in lazy enumeration, as a complete result requires the whole range to be enumerated and a partial result doesn't seem to be worth much.&lt;/p&gt;
&lt;p&gt;However, the stack in this solution requires memory allocation of (size of the enumerable * size of an object reference). To avoid this one can apply a peeking mechanism to find out when one is at index last - 2.&lt;/p&gt;
&lt;p&gt;something like&lt;/p&gt;
&lt;p&gt;result.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt;if (e.MoveNext()) &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;result.Append(e.Current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (e.MovNext()) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;last = e.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (e.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.Append(last);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;last = e.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.Append(last);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;result.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551882</link><pubDate>Thu, 16 Apr 2009 03:43:55 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551882</guid><dc:creator>Denis</dc:creator><description>&lt;p&gt;public static string WeirdString(IEnumerable&amp;lt;string&amp;gt; original)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; // I found out that the StringBuilder is WAY faster than just &amp;quot;+&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; StringBuilder sb = new StringBuilder(&amp;quot;{}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; IEnumerable&amp;lt;string&amp;gt; reversed = original.Reverse();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; // Now the last element is the first&lt;/p&gt;
&lt;p&gt; &amp;nbsp; bool andRatherThanComma = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; bool moreThanOne = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; foreach (string s in reversed)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (moreThanOne)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // If this is NOT the last string in the original list and the first one in the reversed list...&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sb.Insert(andRatherThanComma ? &amp;quot; and &amp;quot; : &amp;quot;, &amp;quot;, 1);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; andRatherThanComma = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;moreThanOne = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Insert(s, 1); // insert the string after the first &amp;quot;{&amp;quot; : if it's the fisrt and the last one, we'll get {string}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; return sb.ToString();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9551958</link><pubDate>Thu, 16 Apr 2009 04:26:19 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9551958</guid><dc:creator>TooShyToPost</dc:creator><description>&lt;p&gt;Hey Eric, why don't you post this on stackoverflow and let the community bubble up the best answers and then you can dissect the best ones on your blog?&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552076</link><pubDate>Thu, 16 Apr 2009 06:10:19 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552076</guid><dc:creator>John Melville</dc:creator><description>&lt;p&gt; &amp;nbsp; &amp;nbsp;/// &amp;lt;param name=&amp;quot;delimiter&amp;quot;&amp;gt;The delimeter placed before all elements except the first and last.&amp;lt;/param&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;/// &amp;lt;param name=&amp;quot;lastDelimiter&amp;quot;&amp;gt;The delimiter placed before the last element.&amp;lt;/param&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;/// &amp;lt;returns&amp;gt;an enumeration with the original elements interleaved with delimiters&amp;lt;/returns&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static IEnumerable&amp;lt;T&amp;gt; Interleave&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; baseEnumeration, T delimiter, T lastDelimiter) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;using (var iter = baseEnumeration.GetEnumerator()) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// guard clause for empty source&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!iter.MoveNext()) yield break;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//first iteration of loop is unrolled because the first item does not have a delimiter&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return iter.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!iter.MoveNext()) yield break;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//This is a while loop with a break in the middle. &amp;nbsp;I reuse the loop termination test to decide which delimiter to&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// use, thus the body of the loop gets repeated.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (true) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;T item = iter.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (iter.MoveNext()) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return delimiter;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return item;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return lastDelimiter;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return item;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield break;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;I already had a concatenate a list to a string method.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;/// Interleaves the specified enumerable with the given delimiter&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;/// &amp;lt;typeparam name=&amp;quot;T&amp;quot;&amp;gt;Basis type of the enumeration&amp;lt;/typeparam&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;/// &amp;lt;param name=&amp;quot;enumerableToInterleave&amp;quot;&amp;gt;The enumerable to interleave.&amp;lt;/param&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;/// &amp;lt;param name=&amp;quot;delimiter&amp;quot;&amp;gt;The delimiter.&amp;lt;/param&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;/// &amp;lt;returns&amp;gt;Original enumeration inteleaved with the given delimiter&amp;lt;/returns&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static IEnumerable&amp;lt;T&amp;gt; Interleave&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; enumerableToInterleave, T delimiter) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Interleave&amp;lt;T&amp;gt;(enumerableToInterleave, delimiter, delimiter);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;and then the answer is trivial.&lt;/p&gt;
&lt;p&gt;public static string EnglishList(this IEnumerable&amp;lt;String&amp;gt; input) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp;return &amp;quot;{&amp;quot; } input.Interleave(&amp;quot;, &amp;quot;, &amp;quot; and &amp;quot;).ConcatenateStrings() + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;This algorithm only iterates the enumerator once, and requires a single element buffer (the item variable) to detect the last element. &amp;nbsp;I think separating the inteleave problem from the concatenation problem makes the code read very clear in spite of the somewhat &amp;quot;clever&amp;quot; loop with an exit in the middle which is used in the interleave method.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552135</link><pubDate>Thu, 16 Apr 2009 07:07:46 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552135</guid><dc:creator>Wil Peck</dc:creator><description>&lt;p&gt;So I should have read the specs a little further and realized that I needed to use the IEnumerable&amp;lt;string&amp;gt; methods in order to implement this algorightm. &amp;nbsp;Just to make sure my solution is still considered I made some adjustments. &amp;nbsp;Please see my revised version below. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;class Program&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(AppendWords(null));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(AppendWords(string.Empty));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(AppendWords(&amp;quot;ABC&amp;quot;));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(AppendWords(&amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(AppendWords(&amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;GHI&amp;quot;));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(AppendWords(&amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;GHI&amp;quot;, &amp;quot;JKL&amp;quot;));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.ReadKey();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string AppendWords(params string[] words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return AppendWordsInternal(words);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string AppendWordsInternal(IEnumerable&amp;lt;string&amp;gt; words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (words == null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder builder = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int appendedWords = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int totalWords = words.Count();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int wordsRemaining = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IEnumerator&amp;lt;string&amp;gt; enumerator = words.GetEnumerator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (enumerator.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(enumerator.Current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;appendedWords++;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;wordsRemaining = totalWords - appendedWords;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (appendedWords &amp;gt;= 1&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;amp;&amp;amp; wordsRemaining &amp;gt;= 2) &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if (wordsRemaining == 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return builder.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552272</link><pubDate>Thu, 16 Apr 2009 09:03:52 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552272</guid><dc:creator>Andrey Titov [izobr]</dc:creator><description>&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string Join(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return JoinHelper(strings).Aggregate(new StringBuilder(), (sb, s) =&amp;gt; sb.Append(s), sb =&amp;gt; sb.ToString());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static IEnumerable&amp;lt;string&amp;gt; JoinHelper(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return &amp;quot;{&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string current = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bool first = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string item in strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (current != null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!first)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return &amp;quot;, &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;first = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;current = item;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(current != null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!first)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return &amp;quot; and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return &amp;quot;}&amp;quot;; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552273</link><pubDate>Thu, 16 Apr 2009 09:05:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552273</guid><dc:creator>Pankaj Sharma</dc:creator><description>&lt;p&gt;public static void Main()&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PrintFriendlyArray(new string[]{&amp;quot;ABC&amp;quot;});&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PrintFriendlyArray(new string[] {&amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;});&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PrintFriendlyArray(new string[] {&amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;,&amp;quot;G&amp;quot;,&amp;quot;H&amp;quot;});&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PrintFriendlyArray(new string[]{&amp;quot;&amp;quot;, &amp;quot;,&amp;quot;,&amp;quot;}&amp;quot;});&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;public static void PrintFriendlyArray(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder friendlyString = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;friendlyString.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;friendlyString.Append(strings.Aggregate((current, next) =&amp;gt; (strings.LastOrDefault().Equals(next)?current + &amp;quot; and &amp;quot; + next: current + &amp;quot;,&amp;quot; + next)));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;friendlyString.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(friendlyString);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552279</link><pubDate>Thu, 16 Apr 2009 09:11:35 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552279</guid><dc:creator>Pankaj Sharma</dc:creator><description>&lt;p&gt;This is my first post ever, Eric. Apart from handling null, wouldn't this program work in all scenarios? I also see that my naming is not consistent. The method name should have been PrintFriendlyString instead of PrintFriendlyArray, right?&lt;/p&gt;
&lt;p&gt;This is the most straightforward and semantically nearest program I could think of.&lt;/p&gt;
&lt;p&gt;Reply if you find time.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552313</link><pubDate>Thu, 16 Apr 2009 09:32:47 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552313</guid><dc:creator>Anton Zlygostev</dc:creator><description>&lt;p&gt; &amp;nbsp; &amp;nbsp;class Program&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(Lippertize(new string[0]));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(Lippertize(new string[]{&amp;quot;ABC&amp;quot;}));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(Lippertize(new string[]{&amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;}));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(Lippertize(new string[]{&amp;quot;ABC&amp;quot;, &amp;quot;DE, F&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot;}));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.ReadKey();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string Lippertize(IEnumerable&amp;lt;string&amp;gt; source)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + Concat(source, &amp;quot;, &amp;quot;, &amp;quot; and &amp;quot;) + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string Concat(IEnumerable&amp;lt;string&amp;gt; source, string separator, string lastSeparator)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var firstItem &amp;nbsp;= true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var gotTwo = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var lastSeparatorPos = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var sb = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var quoted = from s in source&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; where !string.IsNullOrEmpty(s)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; select s;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (var item in quoted)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!firstItem)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;gotTwo = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;lastSeparatorPos = sb.Length;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(separator);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;firstItem = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(item);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (gotTwo) // step back and replace the last separator with the correct one:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Remove(lastSeparatorPos, separator.Length);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Insert(lastSeparatorPos, lastSeparator);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552324</link><pubDate>Thu, 16 Apr 2009 09:38:40 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552324</guid><dc:creator>Steve Wagner</dc:creator><description>&lt;p&gt;Quite verbose (even without the unit tests). But works. &lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Linq;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;using NUnit.Framework;&lt;/p&gt;
&lt;p&gt;namespace CommaQuibble&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;[TestFixture]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public class QuibblerFixture&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void EmptyList()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IEnumerable&amp;lt;string&amp;gt; list = new[] {&amp;quot;&amp;quot;};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string quibbled = GetQuibbled(list);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.AreEqual(&amp;quot;{}&amp;quot;, quibbled);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static string GetQuibbled(IEnumerable&amp;lt;string&amp;gt; list)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Quibbler quibbler = new Quibbler();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return quibbler.Quibble(list);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void OneItemInList()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IEnumerable&amp;lt;string&amp;gt; list = new[] {&amp;quot;ABC&amp;quot;};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string quibbled = GetQuibbled(list); &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.AreEqual(&amp;quot;{ABC}&amp;quot;, quibbled);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void TwoItemsInList()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[] list = new[] { &amp;quot;ABC&amp;quot;, &amp;quot;DE&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string quibbled = GetQuibbled(list);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.AreEqual(&amp;quot;{ABC and DE}&amp;quot;, quibbled);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void ThreeItemsInList()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[] list = new[] { &amp;quot;ABC&amp;quot;, &amp;quot;DE&amp;quot;, &amp;quot;ZYXWV&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string quibbled = GetQuibbled(list);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.AreEqual(&amp;quot;{ABC, DE and ZYXWV}&amp;quot;, quibbled);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void ManyMany()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[] list = new[] { &amp;quot;ABC&amp;quot;, &amp;quot;DE&amp;quot;, &amp;quot;ZYXWV&amp;quot;, &amp;quot;FG&amp;quot;, &amp;quot;UT&amp;quot;, &amp;quot;HI&amp;quot;, &amp;quot;SR&amp;quot;, &amp;quot;JK&amp;quot;, &amp;quot;QP&amp;quot;, &amp;quot;LM&amp;quot;, &amp;quot;NO&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string quibbled = GetQuibbled(list);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.AreEqual(&amp;quot;{ABC, DE, ZYXWV, FG, UT, HI, SR, JK, QP, LM and NO}&amp;quot;, quibbled);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void ViacheslavIvanov()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[] list = new[] { &amp;quot;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;}&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string quibbled = GetQuibbled(list);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.AreEqual(&amp;quot;{, , and }}&amp;quot;, quibbled);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public class Quibbler&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public string Quibble(IEnumerable&amp;lt;string&amp;gt; enumerable)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder builder = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string last = enumerable.Last();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string first = enumerable.First();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(first == last)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(first);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if(first != last)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IEnumerable&amp;lt;string&amp;gt; rest = enumerable.Except(new[] { last });&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string penultimate = rest.Last();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;QuietStack stacked = new QuietStack(rest.Reverse());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (stacked.Peek() != null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string current = stacked.Pop();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (current != penultimate)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.AppendFormat(&amp;quot; and {0}&amp;quot;, last);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return builder.ToString(); &amp;nbsp; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;class QuietStack&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private readonly Stack&amp;lt;string&amp;gt; m_Stack;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public QuietStack(IEnumerable&amp;lt;string&amp;gt; collection)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m_Stack = new Stack&amp;lt;string&amp;gt;(collection);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public string Pop()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return m_Stack.Pop();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public string Peek()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return m_Stack.Peek();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;catch (InvalidOperationException)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552369</link><pubDate>Thu, 16 Apr 2009 10:10:32 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552369</guid><dc:creator>Neil Barnwell</dc:creator><description>&lt;P&gt;How to misuse LINQ:&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void RunTest()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(new Class1().GetResult(new string[] { }));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(new Class1().GetResult(new[] { "ABC" }));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(new Class1().GetResult(new[] { "ABC", "DEF" }));&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(new Class1().GetResult(new[] { "ABC", "DEF", "GHI" }));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public string GetResult(IEnumerable&amp;lt;string&amp;gt; input)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var list = new List&amp;lt;string&amp;gt;(input);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (list.Count == 0) return "{}";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (list.Count == 1) return "{" + list[0] + "}";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return "{" + string.Join(", ", list.Take(list.Count - 1).ToArray()) + " and " + list[list.Count - 1] + "}";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552375</link><pubDate>Thu, 16 Apr 2009 10:12:06 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552375</guid><dc:creator>Siderite</dc:creator><description>&lt;p&gt;I would go with Olivier and mdefalco here. My solution was almost identical to Olivier's.&lt;/p&gt;
&lt;p&gt;I really felt the need to some sort of recursive String.Format method.&lt;/p&gt;
&lt;p&gt;However, one that is closer to my heart is:&lt;/p&gt;
&lt;p&gt;public string Join(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (strings == null || !strings.Any()) return &amp;quot;{}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var q = new Queue&amp;lt;string&amp;gt;(strings);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var last = q.Dequeue();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (q.Count == 0) return &amp;quot;{&amp;quot; + last + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + string.Join(&amp;quot;, &amp;quot;, q.ToArray()) + &amp;quot; and &amp;quot; + last + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552382</link><pubDate>Thu, 16 Apr 2009 10:20:06 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552382</guid><dc:creator>Jafar husain</dc:creator><description>&lt;p&gt;Most of the F# posts use list pattern matching, conveniently ignoring that the input is a sequence, _not_ a list. &amp;nbsp;The following solution allows for pattern matching without incurring the cost of converting the sequence to a list. &amp;nbsp;It is declarative, scales roughly linearly when used with Parallel Extensions, and uses a StringBuilder at the concatenation stage for maximum efficiency.&lt;/p&gt;
&lt;p&gt;open System&lt;/p&gt;
&lt;p&gt;open System.Text&lt;/p&gt;
&lt;p&gt;let concat_string (list: string seq) =&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;let tripleWise = &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Seq.append list [null]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&amp;gt; Seq.scan&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(fun (_, previousPrevious, previous) current -&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(previousPrevious, previous, current)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(null, null, null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;let contents = &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tripleWise.AsParallel()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&amp;gt; PSeq.map &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(function&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| _, null, _ -&amp;gt; String.Empty&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| null, curr, null -&amp;gt; curr &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| null, first, _ -&amp;gt; first&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| _, last, null -&amp;gt; sprintf &amp;quot; and %s&amp;quot; last&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| prev, curr, next -&amp;gt; sprintf &amp;quot;, %s&amp;quot; curr)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;let builder = StringBuilder()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;contents |&amp;gt; Seq.iter (fun item -&amp;gt; (builder.Append(item) |&amp;gt; ignore))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;sprintf &amp;quot;{%s}&amp;quot; (builder.ToString())&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552387</link><pubDate>Thu, 16 Apr 2009 10:25:11 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552387</guid><dc:creator>Todd</dc:creator><description>&lt;p&gt;I like terse:&lt;/p&gt;
&lt;p&gt;string CommaQuibble(IEnumerable&amp;lt;string&amp;gt; words)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return string.Format(&amp;quot;{{{0}}}&amp;quot;, string.Join(&amp;quot;, &amp;quot;, words.Take(words.Count() - 2).Concat(new[] { &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string.Join(&amp;quot; and &amp;quot;, words.Skip(words.Count() - 2).ToArray()) }).ToArray()));&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;(should check for null, though)&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552403</link><pubDate>Thu, 16 Apr 2009 10:40:46 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552403</guid><dc:creator>Ben</dc:creator><description>&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Using SmartEnumerable by John Skeet &lt;a rel="nofollow" target="_new" href="http://msmvps.com/blogs/jon_skeet/archive/2007/07/27/smart-enumerations.aspx"&gt;http://msmvps.com/blogs/jon_skeet/archive/2007/07/27/smart-enumerations.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public string Concatenate(IEnumerable&amp;lt;string&amp;gt; sequence)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SmartEnumerable&amp;lt;string&amp;gt; smartSequence = sequence.AsSmartEnumerable();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder result = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (var word in smartSequence)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!word.IsFirst &amp;amp;&amp;amp; !word.IsLast)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.Append(&amp;quot;, &amp;quot; + word.Value);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if (!word.IsFirst &amp;amp;&amp;amp; word.IsLast )&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.Append(&amp;quot; and &amp;quot; + word.Value);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.Append(word.Value);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552438</link><pubDate>Thu, 16 Apr 2009 11:10:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552438</guid><dc:creator>Matthew</dc:creator><description>&lt;p&gt;My quick solution as a full program. &amp;nbsp;My goals were to stay with an imperative C# style, make the main function readable and to maintain the stream nature of IEnumerable (no multiple passes, no duplication via creating a list/array which makes the problem too simple).&lt;/p&gt;
&lt;p&gt;The trick here is the one-off enumerator that adds an IsFirst/IsLast. &amp;nbsp;Its definitely a one-off class as written since it doesn't obey IEnumerable's specification -- though changing it to do so wouldn't be hard. &amp;nbsp;But you know what they say about code that's not yet needed.&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Linq;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;using System.Collections;&lt;/p&gt;
&lt;p&gt;namespace MakeFancyString&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;class SpecialEnumerable : IEnumerable, IEnumerator&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;private IEnumerator&amp;lt;String&amp;gt; source;&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;private int itemNumber;&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;public SpecialEnumerable(IEnumerable&amp;lt;String&amp;gt; source)&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;		 &amp;nbsp; &amp;nbsp;this.source = source.GetEnumerator();&lt;/p&gt;
&lt;p&gt;		 &amp;nbsp; &amp;nbsp;Reset();&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;public IEnumerator GetEnumerator() { return this; }&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;public bool IsFirst { get { return itemNumber == 0; } }&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;public bool IsLast { get; private set; } &lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;public object Current { get; private set; }&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;public bool MoveNext()&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;		 &amp;nbsp; &amp;nbsp;if (IsLast)&lt;/p&gt;
&lt;p&gt;			 &amp;nbsp; &amp;nbsp;return false;&lt;/p&gt;
&lt;p&gt;		 &amp;nbsp; &amp;nbsp;Current = source.Current;&lt;/p&gt;
&lt;p&gt;		 &amp;nbsp; &amp;nbsp;++itemNumber;&lt;/p&gt;
&lt;p&gt;		 &amp;nbsp; &amp;nbsp;IsLast = !source.MoveNext();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;public void Reset()&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;		 &amp;nbsp; &amp;nbsp;source.Reset();&lt;/p&gt;
&lt;p&gt;		 &amp;nbsp; &amp;nbsp;Current = null;&lt;/p&gt;
&lt;p&gt;		 &amp;nbsp; &amp;nbsp;itemNumber = -1;&lt;/p&gt;
&lt;p&gt;		 &amp;nbsp; &amp;nbsp;IsLast = !source.MoveNext();&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;class Program&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static String MakeList(IEnumerable&amp;lt;String&amp;gt; input)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder builder = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var enumerable = new SpecialEnumerable(input);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (String item in enumerable)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (enumerable.IsFirst)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if (enumerable.IsLast)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(item);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return builder.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(MakeList(new String[] { })); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// {}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(MakeList(new String[] { &amp;quot;ABC&amp;quot; })); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// {ABC}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(MakeList(new String[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, })); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// {ABC and DEF}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(MakeList(new String[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;GHI&amp;quot; })); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// {ABC, DEF and GHI}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(MakeList(new String[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;GHI&amp;quot;, &amp;quot;JKL&amp;quot; })); &amp;nbsp; // {ABC, DEF, GHI and JKL}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552440</link><pubDate>Thu, 16 Apr 2009 11:11:42 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552440</guid><dc:creator>Rik Hemsley</dc:creator><description>&lt;p&gt;Attempting to get this to format properly...&lt;/p&gt;
&lt;p&gt;module Enumerable&lt;/p&gt;
&lt;p&gt; &amp;nbsp;def bracketed_english_join&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;out = inject([]) { |array, item| array + [item, ', '] }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;'{' +&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;case out.length&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;when 0 then ''&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;when 2 then out[0]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else (&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;out[out.length - 3] = ' and ';&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;out[0, out.length - 1].join&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;end +&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;'}'&lt;/p&gt;
&lt;p&gt; &amp;nbsp;end&lt;/p&gt;
&lt;p&gt;end&lt;/p&gt;
&lt;p&gt;if __FILE__ == $0&lt;/p&gt;
&lt;p&gt; &amp;nbsp;require 'test/unit'&lt;/p&gt;
&lt;p&gt; &amp;nbsp;class BracketedEnglishJoinTestCase &amp;lt; Test::Unit::TestCase&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;def test_empty_returns_empty_string&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;assert_equal('{}', [].bracketed_english_join)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;end&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;def test_single_returns_item_only&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;assert_equal(&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'{ABC}',&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;['ABC'].bracketed_english_join&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;end&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;def test_dual_returns_and_separated&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;assert_equal(&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'{ABC and DEF}',&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;['ABC', 'DEF'].bracketed_english_join&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;end&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;def test_many_returns_comma_then_and_separated&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;assert_equal(&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'{ABC, DEF, G and H}',&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;['ABC', 'DEF', 'G', 'H'].bracketed_english_join&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;end&lt;/p&gt;
&lt;p&gt; &amp;nbsp;end&lt;/p&gt;
&lt;p&gt;end&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552445</link><pubDate>Thu, 16 Apr 2009 11:16:47 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552445</guid><dc:creator>Goran</dc:creator><description>&lt;p&gt;I'd serialize the input into xsd conforming xml and use xsl like always :). Xsd available upon request...&lt;/p&gt;
&lt;p&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;xsl:stylesheet version=&amp;quot;1.0&amp;quot; xmlns:xsl=&amp;quot;&lt;a rel="nofollow" target="_new" href="http://www.w3.org/1999/XSL/Transform&amp;quot;"&gt;http://www.w3.org/1999/XSL/Transform&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;xmlns:msxsl=&amp;quot;urn:schemas-microsoft-com:xslt&amp;quot; exclude-result-prefixes=&amp;quot;msxsl&amp;quot;&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:output method=&amp;quot;text&amp;quot; indent=&amp;quot;yes&amp;quot;/&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:value-of select=&amp;quot;'{'&amp;quot;/&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:apply-templates select=&amp;quot;/root/word&amp;quot;/&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:value-of select=&amp;quot;'}'&amp;quot;/&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:template match=&amp;quot;word&amp;quot;&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:choose&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:when test=&amp;quot;position() = 1&amp;quot;&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:value-of select=&amp;quot;.&amp;quot;/&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/xsl:when&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:when test=&amp;quot;position() = last()&amp;quot;&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:value-of select=&amp;quot;concat(' and ', .)&amp;quot;/&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/xsl:when&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:otherwise&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:value-of select=&amp;quot;concat(' , ', .)&amp;quot;/&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/xsl:otherwise&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/xsl:choose&amp;gt; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552467</link><pubDate>Thu, 16 Apr 2009 11:32:36 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552467</guid><dc:creator>atma</dc:creator><description>&lt;p&gt;I guess this solution has already been posted. .Net 2.0&lt;/p&gt;
&lt;p&gt;Public Function Commate(ByVal Items As IEnumerable(Of String)) As String&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ie As IEnumerator(Of String) = Items.GetEnumerator()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim ls As New List(Of String)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;While ie.MoveNext()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ls.Add(ie.Current)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End While&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim sb As New System.Text.StringBuilder()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;{&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If ls.Count &amp;gt; 0 Then&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim beforeAnd As String = String.Join(&amp;quot;, &amp;quot;, ls.ToArray(), 0, ls.Count - 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If ls.Count &amp;gt; 1 Then&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(String.Join(&amp;quot; and &amp;quot;, New String() {beforeAnd, ls(ls.Count - 1)}))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(ls(ls.Count - 1))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;}&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return sb.ToString()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;End Function&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552468</link><pubDate>Thu, 16 Apr 2009 11:33:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552468</guid><dc:creator>David Fowler</dc:creator><description>&lt;p&gt;The problem is really deciding while enumerating, when you are at the penultimate item in the list, presumably without counting. Here's my solution:&lt;/p&gt;
&lt;p&gt;static class Extensions { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static List&amp;lt;T&amp;gt; IntersperseToList&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; values, T delimeter) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;T&amp;gt; res = new List&amp;lt;T&amp;gt;();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bool first = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (var item in values) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!first) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;res.Add(delimeter);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;res.Add(item);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;first = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return res;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string Join(this IEnumerable&amp;lt;string&amp;gt; values) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return String.Join(String.Empty, values.ToArray());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;static string SolveIt(IEnumerable&amp;lt;string&amp;gt; values) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;string&amp;gt; res = values.IntersperseToList(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (res.Count &amp;gt;= 2) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;res[res.Count - 2] = &amp;quot; and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + res.Join() + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var vals = Enumerable.Range(1, 10001).Select(i =&amp;gt; i.ToString());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(SolveIt(vals));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(SolveIt(new string[0]));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(SolveIt(new string[] { &amp;quot;ABC&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(SolveIt(new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(SolveIt(new string[] { &amp;quot;AA&amp;quot;, &amp;quot;BBB&amp;quot;, &amp;quot;CC&amp;quot;, &amp;quot;H&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552486</link><pubDate>Thu, 16 Apr 2009 12:10:54 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552486</guid><dc:creator>Anthony Jones</dc:creator><description>&lt;p&gt;Having read through the various solutions I think Jon nailed it pretty much straight away as far as the actual implementation was concerned. &amp;nbsp; In terms of clearly expressing the semantic its pretty good too however I was initially confused by the first word to be added to the output being the penultimate word. &lt;/p&gt;
&lt;p&gt;Only having analysed the code more was it clear that all words will pass through penultimate and get added to the the builder before being replaced with tne next candidate to be the penultimate.&lt;/p&gt;
&lt;p&gt;I know the comments kinda indicate this but a small tweak changing the variable name 'penultimate' to 'current' would likely have not lead to that confusion in the first place. &lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552487</link><pubDate>Thu, 16 Apr 2009 12:18:32 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552487</guid><dc:creator>rbirkby</dc:creator><description>&lt;p&gt;class Program&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;static void Main()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AreEqual(Stringify(new string[] {}), &amp;quot;{}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AreEqual(Stringify(new [] {&amp;quot;ABC&amp;quot; }), &amp;quot;{ABC}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AreEqual(Stringify(new[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; }), &amp;quot;{ABC and DEF}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AreEqual(Stringify(new[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; }), &amp;quot;{ABC, DEF, G and H}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;static string Stringify(IEnumerable&amp;lt;string&amp;gt; sequence)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string.Join(&amp;quot;, &amp;quot;, sequence.Reverse().Skip(2).Reverse().ToArray()) + &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(sequence.Count()&amp;gt;2?&amp;quot;, &amp;quot;:string.Empty) +&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string.Join(&amp;quot; and &amp;quot;, sequence.Reverse().Take(2).Reverse().ToArray()) +&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;static void AreEqual(string actual, string expected)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (actual != expected) throw new Exception(actual + &amp;quot;!=&amp;quot; + expected);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552505</link><pubDate>Thu, 16 Apr 2009 12:38:16 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552505</guid><dc:creator>Nick Palladinos</dc:creator><description>&lt;p&gt;#r &amp;quot;FSharp.PowerPack.dll&amp;quot;&lt;/p&gt;
&lt;p&gt;let format (words : seq&amp;lt;string&amp;gt;) =&lt;/p&gt;
&lt;p&gt; &amp;nbsp;let rec format (words : LazyList&amp;lt;string&amp;gt;) acc =&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;match words with&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| LazyList.Nil -&amp;gt; string.Empty&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| LazyList.Cons(first, LazyList.Nil) -&amp;gt; first&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| LazyList.Cons(first, LazyList.Cons(second, LazyList.Nil)) -&amp;gt; acc + first + &amp;quot; and &amp;quot; + second&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| LazyList.Cons(first, rest) -&amp;gt; &amp;nbsp;acc + first + &amp;quot;, &amp;quot; |&amp;gt; format rest &lt;/p&gt;
&lt;p&gt; &amp;nbsp;let listOfWords = LazyList.of_seq words &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;&amp;quot;{&amp;quot; + (format &amp;nbsp;listOfWords string.Empty) + &amp;quot;}&amp;quot;&lt;/p&gt;
&lt;p&gt;[&amp;quot;ABC&amp;quot;; &amp;quot;DEF&amp;quot;; &amp;quot;G&amp;quot;; &amp;quot;H&amp;quot; ] |&amp;gt; format&lt;/p&gt;
&lt;p&gt;[&amp;quot;ABC&amp;quot;; &amp;quot;DEF&amp;quot; ] |&amp;gt; format &lt;/p&gt;
&lt;p&gt;[&amp;quot;ABC&amp;quot;] |&amp;gt; format&lt;/p&gt;
&lt;p&gt;[] |&amp;gt; format&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552515</link><pubDate>Thu, 16 Apr 2009 12:45:57 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552515</guid><dc:creator>Gonzalo</dc:creator><description>&lt;p&gt;Here's mine! &lt;/p&gt;
&lt;p&gt;public string Format(IList&amp;lt;string&amp;gt; items)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;string separator = items.Count &amp;lt;= 1 ? &amp;quot;&amp;quot; : &amp;quot; and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;string allButLast = string.Join(&amp;quot;, &amp;quot;, items.TakeWhile((t, i) =&amp;gt; i &amp;lt; items.Count - 1).ToArray());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return string.Format(&amp;quot;{{{0}{1}{2}}}&amp;quot;, allButLast, separator, items.LastOrDefault());&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;public string Format(IEnumerable&amp;lt;string&amp;gt; items)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return Format(new List&amp;lt;string&amp;gt;(items));&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>An F# Solution to Eric Lippert's Challenge</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552533</link><pubDate>Thu, 16 Apr 2009 12:59:08 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552533</guid><dc:creator>Thoughts and Code</dc:creator><description>&lt;p&gt;Ο Erik Lippert στο τελευταίο του blog post , έθεσε ένα απλό προβληματάκι. Ακολουθεί η λύση που έκανα&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552559</link><pubDate>Thu, 16 Apr 2009 13:19:48 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552559</guid><dc:creator>Michael McMullen</dc:creator><description>&lt;p&gt;Looks like I'm a bit late, but here's my F# solution:&lt;/p&gt;
&lt;p&gt;let foo sequence =&lt;/p&gt;
&lt;p&gt; &amp;nbsp; let rec bar ss =&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; match ss with&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; | [] -&amp;gt; &amp;quot;&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; | [a] -&amp;gt; a&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; | [a;b] -&amp;gt; sprintf &amp;quot;%s and %s&amp;quot; a b&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; | a::b -&amp;gt; sprintf &amp;quot;%s, %s&amp;quot; a (bar b)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; sprintf &amp;quot;{%s}&amp;quot; (sequence |&amp;gt; List.of_seq |&amp;gt; bar)&lt;/p&gt;
&lt;p&gt;And my C# solution:&lt;/p&gt;
&lt;p&gt;public string foo(IEnumerable&amp;lt;string&amp;gt; sequence)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;var stack = new Stack&amp;lt;string&amp;gt;(sequence);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;string result = &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (stack.Count &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = stack.Pop() + result;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (stack.Count &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = stack.Pop() + &amp;quot; and &amp;quot; + result;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;while (stack.Count &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = stack.Pop() + &amp;quot;, &amp;quot; + result;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + result;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552562</link><pubDate>Thu, 16 Apr 2009 13:24:27 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552562</guid><dc:creator>Andreas Kromann</dc:creator><description>&lt;p&gt;I made two versions. One is recursive and very simple. The other is using extension methods a bit more, but faily simple to read aswell.&lt;/p&gt;
&lt;p&gt;Code:&lt;/p&gt;
&lt;p&gt; &amp;nbsp;class StringConcatenator&lt;/p&gt;
&lt;p&gt; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static string Concatenate(IEnumerable&amp;lt;string&amp;gt; input)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + ConcatenateRecursive(input) + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private static string ConcatenateRecursive(IEnumerable&amp;lt;string&amp;gt; input)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch (input.Count ())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 0:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return string.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 1:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return input.First ();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 2:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return input.First () + &amp;quot; and &amp;quot; + input.Last ();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return input.First () + &amp;quot;, &amp;quot; + ConcatenateRecursive (input.Skip (1));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static string Concatenate2(IEnumerable&amp;lt;string&amp;gt; input)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;string result;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch (input.Count ())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 0:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = string.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 1:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = input.First();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = input.Take (input.Count () - 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Aggregate ((n, t) =&amp;gt; n + &amp;quot;, &amp;quot; + t) &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+ &amp;quot; and &amp;quot; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+ input.Last();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + result + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552579</link><pubDate>Thu, 16 Apr 2009 13:34:46 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552579</guid><dc:creator>Ryan Heath</dc:creator><description>&lt;p&gt;I realized my version could be slighty better.&lt;/p&gt;
&lt;p&gt;Here it is, still without use of StringBuilder ;)&lt;/p&gt;
&lt;p&gt;static string Extend(string concat, string separator, string value)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp;if ( value == null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return concat;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;if ( concat != null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return concat + separator + value;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;return value;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;static string Concat(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp;string concat = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;string lastItem = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;foreach(var s in strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;concat = Extend(concat, &amp;quot;, &amp;quot;, lastItem);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;lastItem = s;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;concat = Extend(concat,&amp;quot; and &amp;quot;, lastItem);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;return &amp;quot;{&amp;quot; + concat + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;// Ryan&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552660</link><pubDate>Thu, 16 Apr 2009 14:19:54 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552660</guid><dc:creator>fred</dc:creator><description>&lt;p&gt;// My vote: Best is izobr version.&lt;/p&gt;
&lt;p&gt;// See: izobr (April 16, 2009 12:07 AM)&lt;/p&gt;
&lt;p&gt;// Here is little bit refactored izobr version.&lt;/p&gt;
&lt;p&gt;private static IEnumerable&amp;lt;string&amp;gt; ConcatNoOxford(IEnumerable&amp;lt;string&amp;gt; source)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp;yield return &amp;quot;{&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;string prevItem = null; &amp;nbsp; // Use like stack.&lt;/p&gt;
&lt;p&gt; &amp;nbsp;bool hasAnyItem = false; &amp;nbsp;// Target sequence has any item from source sequence.&lt;/p&gt;
&lt;p&gt; &amp;nbsp;foreach (string item in source)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;//TODO: Check for null/empty.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (prevItem != null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (hasAnyItem)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;hasAnyItem = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return &amp;quot;, &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return prevItem;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;prevItem = item;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;if (prevItem != null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (hasAnyItem)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return &amp;quot; and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;yield return prevItem;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;yield return &amp;quot;}&amp;quot;; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552667</link><pubDate>Thu, 16 Apr 2009 14:20:58 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552667</guid><dc:creator>Mauro</dc:creator><description>&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private string Join( IEnumerable&amp;lt;string&amp;gt; input ) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;string&amp;gt; list = new List&amp;lt;string&amp;gt;( input );&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return SurroundWithBrackets( FormatElements( list ) );&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static string FormatElements( List&amp;lt;string&amp;gt; list ) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ( list.Count == 0 ) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;nbsp;string.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ( list.Count == 1 ) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return list[ 0 ];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder result = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach ( string item in AllExceptLastTwo( list ) ) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.AppendFormat( &amp;quot;{0}, &amp;quot;, item );&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.Append( FormatLastTwoItems( list ) );&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static string SurroundWithBrackets( string input ) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return string.Format( &amp;quot;{{{0}}}&amp;quot;, input );&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static string FormatLastTwoItems( IList&amp;lt;string&amp;gt; list ) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int listCount = list.Count;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return string.Format( &amp;quot;{0} and {1}&amp;quot;, list[ listCount - 2 ], list[ listCount - 1 ] );&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static IEnumerable&amp;lt;string&amp;gt; AllExceptLastTwo( List&amp;lt;string&amp;gt; list ) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//if ( list.Count &amp;lt; 3 ) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &amp;nbsp; &amp;nbsp;return new string[0];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return list.GetRange( 0, list.Count - 2 );&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Test&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private IEnumerable&amp;lt;string&amp;gt; input;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private void AssertJoinIs( string exepcted ) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string actual = joiner.Join( input );&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine( &amp;quot;Actual: &amp;quot; + actual );&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.AreEqual( exepcted, actual );&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void Empty() {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;input = new List&amp;lt;string&amp;gt;();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AssertJoinIs( &amp;quot;{}&amp;quot; );&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void SingleElement() {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;input = new string[] {&amp;quot;ABC&amp;quot;};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AssertJoinIs( &amp;quot;{ABC}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void TwoElements() {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;input = new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AssertJoinIs( &amp;quot;{ABC and DEF}&amp;quot; );&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void MoreElements() {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;input = new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AssertJoinIs( &amp;quot;{ABC, DEF, G and H}&amp;quot; );&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552669</link><pubDate>Thu, 16 Apr 2009 14:21:13 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552669</guid><dc:creator>rbirkby</dc:creator><description>&lt;p&gt;Eric, could you please do a post about StringBuilder and how the compiler will usually introduce a call to a string.Concat() overload. Many people (even in this thread) seem to have no idea what the compiler is doing and believe they have to use StringBuilder any time they concatenate one string with another.&lt;/p&gt;
&lt;p&gt;If I had a penny for every time in a code review someone has complained that I concatenated strings using '+' instead of using StringBuilder..... &lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552698</link><pubDate>Thu, 16 Apr 2009 14:42:54 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552698</guid><dc:creator>[ICR]</dc:creator><description>&lt;p&gt;I am a fan of the recursive solution, as it fits closely with how the problem is stated.&lt;/p&gt;
&lt;p&gt;My first attempt was very similar to Andreas Kromann's except I used ToArray to remove the need to traverse the IEnumerable each time with count and an offset to remove the need for slow array splicing.&lt;/p&gt;
&lt;p&gt;This solution uses a lot of string concatenation, which for large lists would cause performance problems (the problem states that the sequences could be large). My second attempt was very similar but passed in a StringBuilder. While this was more efficient it was less clear.&lt;/p&gt;
&lt;p&gt;My third attempt was to try and find a happy middle ground between the two. I ended up using recursion to generate a new IEnumerable which I could then consume and use a StringBuilder to combine.&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;using System.Linq;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;public class CommaQuibble&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private static IEnumerable&amp;lt;string&amp;gt; ToList(string[] strings, int start)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;	int length = strings.Length - start;&lt;/p&gt;
&lt;p&gt;	if (length == 0)&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;yield return string.Empty;&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;	else if (length == 1)&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;yield return strings[start];&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;	else if (length == 2)&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;yield return strings[start] + &amp;quot; and &amp;quot; + strings[start + 1];&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;	else&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;yield return strings[start] + &amp;quot;, &amp;quot;;&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;/* Concatinate the result of the recursive call to the end of this IEnumerable. */&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;foreach(string s in ToList(strings, start + 1))&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;		yield return s;&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static string ToList(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;	StringBuilder stringBuilder = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt;	foreach(string s in ToList(strings.ToArray(), 0))&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;stringBuilder.Append(s);&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;	stringBuilder.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt;	return stringBuilder.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static void Main()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;	List&amp;lt;string&amp;gt; list = new List&amp;lt;string&amp;gt;() {&amp;quot;one&amp;quot;, &amp;quot;two&amp;quot;, &amp;quot;three&amp;quot;};&lt;/p&gt;
&lt;p&gt;	Console.WriteLine(ToList(list));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552763</link><pubDate>Thu, 16 Apr 2009 15:15:05 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552763</guid><dc:creator>ptoniolo</dc:creator><description>&lt;p&gt;I dont't like code that has to undo what proviously done before. But my standard solution for the original problem is to always append comma-value and than returning the final string from the second char on.&lt;/p&gt;
&lt;p&gt;For this problem I found a nice solution with very few variables, and no backtracking:&lt;/p&gt;
&lt;p&gt;	string Stringize1(IEnumerable&amp;lt;string&amp;gt; list) {&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp;StringBuilder sb = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp;IEnumerator&amp;lt;string&amp;gt; enumerator = list.GetEnumerator();&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp;if(enumerator.MoveNext()) {&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;sb.Append(enumerator.Current);&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;if(enumerator.MoveNext()) {&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp; &amp;nbsp;string current = enumerator.Current;&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp; &amp;nbsp;while(enumerator.MoveNext()) {&lt;/p&gt;
&lt;p&gt;		sb.AppendFormat(&amp;quot;, {0}&amp;quot;,current);&lt;/p&gt;
&lt;p&gt;		current = enumerator.Current;&lt;/p&gt;
&lt;p&gt;		}&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.AppendFormat(&amp;quot; and {0}&amp;quot;,current);&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp;return sb.Append(&amp;quot;}&amp;quot;).ToString();&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;The inner declaration of the string variable and the while-loop can be also expressed this way:&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp; &amp;nbsp;string current;&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp; &amp;nbsp;for(current=enumerator.Current; enumerator.MoveNext(); current=enumerator.Current)&lt;/p&gt;
&lt;p&gt;		sb.AppendFormat(&amp;quot;, {0}&amp;quot;,current);&lt;/p&gt;
&lt;p&gt;but this is a matter of taste... I prefer the former, because I need to explicitly define the string var outside the loop, because I need to use it after the loop termination!&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552766</link><pubDate>Thu, 16 Apr 2009 15:17:45 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552766</guid><dc:creator>Adrian Martin</dc:creator><description>&lt;p&gt;Olivier Leclant's answer is by far the best.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552780</link><pubDate>Thu, 16 Apr 2009 15:28:43 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552780</guid><dc:creator>Austin Donnelly</dc:creator><description>&lt;p&gt;Here's the smallest, efficient solution. &amp;nbsp;Stringbuilder, and track the position of the last comma, for conversion to &amp;quot; and &amp;quot;.&lt;/p&gt;
&lt;p&gt;static string PrettyPrint(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bool firstString = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int lastCommaPos = -1; /* no comma, yet */&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var sb = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (var s in strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!firstString)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;lastCommaPos = sb.Length;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(s);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;firstString = false; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* if we have a final comma, turn it into &amp;quot; and &amp;quot; */&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lastCommaPos != -1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Replace(&amp;quot;, &amp;quot;, &amp;quot; and &amp;quot;, lastCommaPos, 2);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.ToString();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552781</link><pubDate>Thu, 16 Apr 2009 15:29:24 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552781</guid><dc:creator>Rik Hemsley</dc:creator><description>&lt;p&gt;I like Jafar Husain's strategy and have attempted a port to Ruby. There are pattern matching implementations for Ruby, but nothing in the core language, so here a case statement has to suffice.&lt;/p&gt;
&lt;p&gt;module Enumerable&lt;/p&gt;
&lt;p&gt; &amp;nbsp;def bracketed_english_join&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;s = &amp;quot;{&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;triple {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|one, two, three|&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;when two == nil&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;s &amp;lt;&amp;lt; &amp;quot;&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;when one == nil &amp;amp;&amp;amp; three == nil&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;s &amp;lt;&amp;lt; two&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;when one == nil&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;s &amp;lt;&amp;lt; two&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;when three == nil&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;s &amp;lt;&amp;lt; &amp;quot; and &amp;quot; &amp;lt;&amp;lt; two&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else &amp;nbsp;s &amp;lt;&amp;lt; &amp;quot;, &amp;quot; &amp;lt;&amp;lt; two&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;end&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;s &amp;lt;&amp;lt; &amp;quot;}&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;end&lt;/p&gt;
&lt;p&gt; &amp;nbsp;def triple&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;prepre = pre = current = nil;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;yield [nil, nil, nil]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;each do |item|&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;prepre = pre;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;pre = current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;current = item;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield [prepre, pre, current]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;end&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;yield [pre, current, nil]&lt;/p&gt;
&lt;p&gt; &amp;nbsp;end&lt;/p&gt;
&lt;p&gt;end&lt;/p&gt;
&lt;p&gt;if __FILE__ == $0&lt;/p&gt;
&lt;p&gt; require 'test/unit'&lt;/p&gt;
&lt;p&gt; class BracketedEnglishJoinTestCase &amp;lt; Test::Unit::TestCase&lt;/p&gt;
&lt;p&gt; &amp;nbsp; def test_empty_returns_empty_string&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; assert_equal('{}', [].bracketed_english_join)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; end&lt;/p&gt;
&lt;p&gt; &amp;nbsp; def test_single_returns_item_only&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; assert_equal(&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; '{ABC}',&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; ['ABC'].bracketed_english_join&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; )&lt;/p&gt;
&lt;p&gt; &amp;nbsp; end&lt;/p&gt;
&lt;p&gt; &amp;nbsp; def test_dual_returns_and_separated&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; assert_equal(&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; '{ABC and DEF}',&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; ['ABC', 'DEF'].bracketed_english_join&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; )&lt;/p&gt;
&lt;p&gt; &amp;nbsp; end&lt;/p&gt;
&lt;p&gt; &amp;nbsp; def test_many_returns_comma_then_and_separated&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; assert_equal(&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; '{ABC, DEF, G and H}',&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; ['ABC', 'DEF', 'G', 'H'].bracketed_english_join&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; )&lt;/p&gt;
&lt;p&gt; &amp;nbsp; end&lt;/p&gt;
&lt;p&gt; end&lt;/p&gt;
&lt;p&gt;end&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552811</link><pubDate>Thu, 16 Apr 2009 15:53:57 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552811</guid><dc:creator>Jon Skeet</dc:creator><description>&lt;p&gt;@rbirkby: Could you point out a usage of StringBuilder in this thread which is inappropriate?&lt;/p&gt;
&lt;p&gt;Yes, the compiler will use String.Concat - but in this situation you really do want to use StringBuilder.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552842</link><pubDate>Thu, 16 Apr 2009 16:12:37 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552842</guid><dc:creator>Jon Skeet</dc:creator><description>&lt;p&gt;Just to clarify my last comment - it's fair to say that if you're already using string.Join (as rbirkby's solution does) then using StringBuilder wouldn't help much. However, the solutions which only build the result up as they go without *any* duplicate strings being created (beyond StringBuilder buffer doubling) are going to be better off using StringBuilder than string concatenation.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552852</link><pubDate>Thu, 16 Apr 2009 16:19:49 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552852</guid><dc:creator>Riccardo Tarli</dc:creator><description>&lt;p&gt;Not so efficient since I cannot assume the IEnumerable be a specific &amp;nbsp;containar and need to count elementes, but to me simple enough.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;public string StringCommas(IEnumerable&amp;lt;string&amp;gt; collection)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Count Elements&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int numberOfCollection = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string item in collection)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;numberOfCollection++; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int numOfLeftSeparator = numberOfCollection - 1;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string result = &amp;quot;&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string item in collection)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result += item;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (numOfLeftSeparator == 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result += &amp;quot; and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if (numOfLeftSeparator &amp;gt; 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result += &amp;quot; ,&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;numOfLeftSeparator--;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + result + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552856</link><pubDate>Thu, 16 Apr 2009 16:25:53 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552856</guid><dc:creator>Andrey Titov [izobr]</dc:creator><description>&lt;p&gt;I have extract position detection algorythm from my previous post to extension method, which seems to be very usable in similar scenarious.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string Join2(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var delimiter = new Dictionary&amp;lt;ItemPosition, string&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{ItemPosition.First, &amp;quot;&amp;quot;},&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{ItemPosition.Single, &amp;quot;&amp;quot;},&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{ItemPosition.Default, &amp;quot;, &amp;quot;},&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{ItemPosition.Last, &amp;quot; and &amp;quot;},&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return strings&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.GetPositions()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Aggregate(&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new StringBuilder(&amp;quot;{&amp;quot;), &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(sb, item)=&amp;gt; sb&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Append(delimiter[item.Position])&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Append(item.Value),&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb =&amp;gt; sb&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Append(&amp;quot;}&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.ToString()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Flags]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public enum ItemPosition&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Default = 0,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;First = 1,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Last = 2,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Single = First | Last,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public class PositionedItem&amp;lt;T&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private ItemPosition m_position;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private T m_value;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public PositionedItem(ItemPosition position, T value)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m_position = position;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m_value = value;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public ItemPosition Position { get { return m_position; } }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public T Value { get { return m_value; } }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static IEnumerable&amp;lt;PositionedItem&amp;lt;T&amp;gt;&amp;gt; GetPositions&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; items)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;T current = default(T);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bool thereAreItems = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ItemPosition position = ItemPosition.First;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (var item in items)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (thereAreItems)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return new PositionedItem&amp;lt;T&amp;gt;(position, current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;position = ItemPosition.Default;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;current = item;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;thereAreItems = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!thereAreItems)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield break;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;position |= ItemPosition.Last;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return new PositionedItem&amp;lt;T&amp;gt;(position, current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;(It seems my post is not appears in a couple of hours, so I repost it with little changes.)&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552859</link><pubDate>Thu, 16 Apr 2009 16:28:42 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552859</guid><dc:creator>Sam Webb</dc:creator><description>&lt;p&gt;It seems to me that everyone using the Count() extension method on IEnumerable multiple times would do well to just translate the IEnumerable&amp;lt;string&amp;gt; to a List&amp;lt;string&amp;gt;, as each invocation of Enumerable.Count() does a complete iteration. The List implementation keeps that count internally, making it a single operation to retrieve it. You'll take a single hit converting it to a List&amp;lt;&amp;gt;, as opposed to multiple hits calling Count() multiple times.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552880</link><pubDate>Thu, 16 Apr 2009 16:38:12 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552880</guid><dc:creator>Riccardo Tarli</dc:creator><description>&lt;p&gt;Sorry. A little bit better removng an else :)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public string StringCommas(IEnumerable&amp;lt;string&amp;gt; collection)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Count Elements&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int numberOfCollection = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string item in collection)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;numberOfCollection++; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int numOfLeftSeparator = numberOfCollection - 1;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string result = &amp;quot;&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string item in collection)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result += item;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (numOfLeftSeparator == 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result += &amp;quot; and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (numOfLeftSeparator &amp;gt; 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result += &amp;quot; ,&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;numOfLeftSeparator--;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + result + &amp;quot;}&amp;quot;;&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552918</link><pubDate>Thu, 16 Apr 2009 17:03:34 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552918</guid><dc:creator>Sergei Tulentsev</dc:creator><description>&lt;P&gt;This is my two cents :-)&lt;/P&gt;
&lt;P&gt;using System;&lt;BR&gt;using System.Collections.Generic;&lt;BR&gt;namespace lippert_strings&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; class MainClass&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void Main(string[] args)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("{}" == SmartJoin(new string[0]));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("{ABC}" == SmartJoin(new string[]{"ABC"}));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("{ABC and DEF}" == SmartJoin(new string[]{"ABC", "DEF"}));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("{ABC, DEF, G and H}" == SmartJoin(new string[]{"ABC", "DEF", "G", "H"}));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("{ABC, \"DE, F\", G and H}" == SmartJoin(new string[]{"ABC", "DE, F", "G", "H"}));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("{\"A and BC\", DEF, G and H}" == SmartJoin(new string[]{"A and BC", "DEF", "G", "H"}));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.ReadKey();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static string EscapeString(string source)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(source.IndexOf(' ') != -1 ||&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; source.IndexOf(',') != -1 ||&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; source.IndexOf('{') != -1 ||&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; source.IndexOf('}') != -1)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return "\"" + source + "\"";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return source;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static string SmartJoin(IEnumerable&amp;lt;string&amp;gt; source)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string lastValue = null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;string&amp;gt; firstValues = new List&amp;lt;string&amp;gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach(var current in source)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(lastValue != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; firstValues.Add(lastValue);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lastValue = EscapeString(current);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var firstValuesStr = "";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(firstValues.Count &amp;gt; 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; firstValuesStr = string.Join(", ", firstValues.ToArray()) + " and ";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var result = string.Format("{{{0}{1}}}", firstValuesStr, lastValue);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return result;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552919</link><pubDate>Thu, 16 Apr 2009 17:03:45 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552919</guid><dc:creator>Matt</dc:creator><description>&lt;p&gt;Sam the Count() extension does a sneak peak at the type and the standard collection implementations will result in a call to Count property rather than enumeration&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552922</link><pubDate>Thu, 16 Apr 2009 17:08:23 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552922</guid><dc:creator>ericeil</dc:creator><description>&lt;P&gt;Fun problem! &amp;nbsp;Elegance is in the eye of the beholder, but this one's at least a little different from those posted by others. &amp;nbsp;Single pass, no back-patching of the output, and fairly readable:&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp;static string InsertCommas(IEnumerable&amp;lt;string&amp;gt; strings)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuilder builder = new StringBuilder();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bool first = true;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.Append('{');&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strings.Aggregate(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(string)null, //init prev to null&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(prev, current) =&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (prev != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!first)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.Append(", ");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;first = false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.Append(prev);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return current;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(last) =&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (last != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!first)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.Append(" and ");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.Append(last);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return string.Empty;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.Append('}');&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return builder.ToString();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552926</link><pubDate>Thu, 16 Apr 2009 17:10:31 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552926</guid><dc:creator>Chris Benard</dc:creator><description>&lt;P&gt;I didn't add StringBuilder, to keep the posting short, but here is mine. I used regex instead of complicated logic "remembering" the last type, etc.&lt;/P&gt;
&lt;P&gt;using System;&lt;BR&gt;using System.Text.RegularExpressions;&lt;BR&gt;namespace CommaQuibbling&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;class Program&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static void Main(string[] args)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Output:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// {}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// {ABC}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// {ABC and DEF}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// {ABC, DEF, G and H}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(joinWords(""));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(joinWords("ABC"));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(joinWords("ABC", "DEF"));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(joinWords("ABC", "DEF", "G", "H"));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.ReadLine();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private static string joinWords(params string[] words)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Add the commas and brackets&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string returnString = "{" + string.Join(", ", words) + "}";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Add the "and", and remove the last comma&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string pattern = @"^(?&amp;lt;First&amp;gt;.*), (?&amp;lt;Last&amp;gt;.*)$";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;returnString = Regex.Replace(returnString, pattern,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;match =&amp;gt; match.Groups["First"].Value + " and " + match.Groups["Last"].Value);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return returnString;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;}&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552935</link><pubDate>Thu, 16 Apr 2009 17:14:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552935</guid><dc:creator>Jeff Armstrong</dc:creator><description>&lt;P&gt;This is my attempt at making the code quite explicit in what it's doing by using extension methods. It's not the most efficient of ways but I think it does say what it trying to do (arguably anyway). &lt;/P&gt;
&lt;P&gt;//the main method&lt;BR&gt;public string StringQuibble( IEnumerable&amp;lt;string&amp;gt; strings )&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return "{" + strings.Concat( ", ").ReplaceLastDelimiter( ", ", " and " ) + "}";&lt;BR&gt;}&lt;BR&gt;///the extension methods&lt;BR&gt;public static class StringQubbleExtensions&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public static string Concat( this IEnumerable&amp;lt;string&amp;gt; strings, string delimiter )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuilder sb = new StringBuilder();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if( strings != null )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IEnumerator&amp;lt;string&amp;gt; stingsEnumerator = strings.GetEnumerator();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if( stringsEnumerator.MoveNext() )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append( stringsEnumerator.Current );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while( stringsEnumerator.MoveNext() )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append( delimiter );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append( stringsEnumerator.Current );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return sb.ToString();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp;public static string ReplaceLastDelimiter( this string str, string delimiterToReplace, string delimiterReplacement )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if( str.IndexOf( delimiterToReplace ) &amp;gt; -1 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuilder sb = new StringBuilder( str );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return sb.Replace( delimiterToReplace, delimiterReplacement, str.LastIndexOf( delimiterToReplace), delimiterToReplace.Length ).ToString();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return str;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;}&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552945</link><pubDate>Thu, 16 Apr 2009 17:21:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552945</guid><dc:creator>Todd</dc:creator><description>&lt;p&gt;Still terse: &amp;nbsp; &amp;nbsp;(Sam... calling Count() is cheaper than creating a new list... Take, Skip and Concat use deferred execution so the only list building is done at the ToArray calls, the second of which is always two or less elements in size)&lt;/p&gt;
&lt;p&gt;static string CommaQuibble(IEnumerable&amp;lt;string&amp;gt; words)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;int clip = words.Count() - 2;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;var head = words.Take(clip);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;var tail = words.Skip(clip);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;return string.Format(&amp;quot;{{{0}}}&amp;quot;, string.Join(&amp;quot;, &amp;quot;, head.Concat(new[] { string.Join(&amp;quot; and &amp;quot;, tail.ToArray()) }).ToArray()));&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552962</link><pubDate>Thu, 16 Apr 2009 17:30:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552962</guid><dc:creator>Mark Rendle</dc:creator><description>&lt;P&gt;public static string FormatList(IEnumerable&amp;lt;string&amp;gt; source)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;string last = source.DefaultIfEmpty().Last();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return "{" +&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;source.DefaultIfEmpty()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Aggregate(new StringBuilder(),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(acc, next) =&amp;gt; acc.AppendFormat(", {0}", next),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;acc =&amp;gt; Regex.Replace(acc.ToString().Substring(2), ", " + last + "$", " and "&amp;nbsp; last))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+ "}";&lt;BR&gt;}&lt;/P&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552967</link><pubDate>Thu, 16 Apr 2009 17:34:08 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552967</guid><dc:creator>Mark Rendle</dc:creator><description>&lt;p&gt;@Chris Benard: what if the last string contains &amp;quot; ,&amp;quot;?&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552981</link><pubDate>Thu, 16 Apr 2009 17:42:12 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552981</guid><dc:creator>Sam Webb</dc:creator><description>&lt;p&gt;Fair enouch: Count() is cheaper than creating a new collection if the object implementing IEnumerable also implements ICollection. That said, I looked at this problem under the assumption that we're dealing with Foo : IEnumerable&amp;lt;string&amp;gt; and nothing else.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9552997</link><pubDate>Thu, 16 Apr 2009 17:51:33 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9552997</guid><dc:creator>Mark Rendle</dc:creator><description>&lt;p&gt;Revised version which only iterates the source once:&lt;/p&gt;
&lt;p&gt;public static string FormatList(IEnumerable&amp;lt;string&amp;gt; source)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;string last = string.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; +&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;source.DefaultIfEmpty()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Aggregate(new StringBuilder(),&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(acc, next) =&amp;gt; acc.AppendFormat(&amp;quot;, {0}&amp;quot;, last = next),&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acc =&amp;gt; Regex.Replace(acc.ToString().Substring(2), &amp;quot;, &amp;quot; + last + &amp;quot;$&amp;quot;, &amp;quot; and &amp;quot; + last))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+ &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553023</link><pubDate>Thu, 16 Apr 2009 18:23:25 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553023</guid><dc:creator>Mark Rendle</dc:creator><description>&lt;p&gt;Hideously obfuscated solution:&lt;/p&gt;
&lt;p&gt;public static string FormatList(IEnumerable&amp;lt;string&amp;gt; source)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;var array = source.ToArray();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + ((array.Length == 0) ? string.Empty : (array.Length == 1) ? array[0] :&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string.Join(&amp;quot;, &amp;quot;, array, 0, array.Length - 1) + &amp;quot; and &amp;quot; + array[array.Length - 1]) + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553066</link><pubDate>Thu, 16 Apr 2009 18:44:10 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553066</guid><dc:creator>Rik Hemsley</dc:creator><description>&lt;p&gt;Eric, I like your use of Aggregate().&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553067</link><pubDate>Thu, 16 Apr 2009 18:44:47 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553067</guid><dc:creator>Andrey Titov [izobr]</dc:creator><description>&lt;p&gt;It is not so costly to materialize list of strings in this task. Resulting string will consume same amount of memory if average length of word will be two characters (on x86). So we can simply get list and look on indexies.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string Join3(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var list = (strings as IList&amp;lt;string&amp;gt;) ?? strings.ToList();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var result = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; list.Count; i++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Append(i == 0 &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;? &amp;quot;&amp;quot; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: (i == list.Count - 1) &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;? &amp;quot; and &amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: &amp;quot;, &amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Append(list[i]);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Append(&amp;quot;}&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;Or do little more optomization in case when source is ICollection.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string Join4(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var list = (strings as ICollection&amp;lt;string&amp;gt;) ?? strings.ToList();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var result = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int i = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (var item in list)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Append(i == 0&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;? &amp;quot;&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: (i == list.Count - 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;? &amp;quot; and &amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: &amp;quot;, &amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Append(item);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;i++;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Append(&amp;quot;}&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553077</link><pubDate>Thu, 16 Apr 2009 19:00:07 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553077</guid><dc:creator>rbirkby</dc:creator><description>&lt;p&gt;@Jon Skeet: A quick look found the following: Jacob, Skrud, Tim Jarvis, Pankaj Sharma. I got bored at that point and had a train to catch.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553082</link><pubDate>Thu, 16 Apr 2009 19:07:28 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553082</guid><dc:creator>Joren</dc:creator><description>&lt;p&gt;Sam Webb is right about Count(). &lt;/p&gt;
&lt;p&gt;If you're going for an iterative solution, I see three decent approaches:&lt;/p&gt;
&lt;p&gt;The first is to manually enumerate (and only once), with some tricks to special case the first and last element, or the last two elements (depending on whether you consider the seperators as a prefix or as a suffix to the elements). Jon Skeet did this well, but my favorite in this category must be John Spong's solution, for his elegant improvement over using some buffer variables by using a queue.&lt;/p&gt;
&lt;p&gt;The second approach is to immediately convert to a list and then indexing the items in a straightforward way. (String.Join is also a good option here.) My favorite here is by Nick (at April 15, 2009 6:11 PM)&lt;/p&gt;
&lt;p&gt;The third approach is to disregard the number of times you enumerate the list (as long as it's a constant; I don't like the idea of a solution with quadratic complexity, for a simple problem like this) and use some LINQ magic for getting something elegant. Olivier Leclant does this well.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553101</link><pubDate>Thu, 16 Apr 2009 19:19:46 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553101</guid><dc:creator>Jon Skeet</dc:creator><description>&lt;p&gt;@rbirkby: Of those, only Pankaj Sharma's solution seems to be obviously convertible to use string concatenation with no loss of either readability or performance. Yes, some of those others could be converted into one very complicated string concatenation, possibly including conditional expressions - but I don't think that's actually a good idea.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553108</link><pubDate>Thu, 16 Apr 2009 19:23:52 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553108</guid><dc:creator>Andrey Titov [izobr]</dc:creator><description>&lt;p&gt;To make it clean for all who uses Count(). Lets assume this simple test:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string result;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var start = DateTime.Now;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = Join(GetStrings(10));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var end = DateTime.Now;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(@&amp;quot;It takes {0}s to get &amp;quot;&amp;quot;{1}&amp;quot;&amp;quot; result&amp;quot;, (end-start).TotalSeconds, result);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(&amp;quot;Press enter...&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.ReadLine();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static IEnumerable&amp;lt;string&amp;gt; GetStrings(int n)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; n; i++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Do some hard work here...&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.Threading.Thread.Sleep(500);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return ((char)('a' + i)).ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp;&lt;/p&gt;
&lt;p&gt;There source does not implement anything except IEnumerable and enumeration is very costly. So usualy it effectively to get list first of all and then manipulate on it rather than call Count() which internally performs enumeration and then enumerate twice.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553142</link><pubDate>Thu, 16 Apr 2009 19:45:48 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553142</guid><dc:creator>iyo</dc:creator><description>&lt;p&gt;Maybe I misunderstood something but my function in python is only 1-line long (there are no checks for types and so on) with full functionality&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; def f(input): return &amp;quot;{&amp;quot;+&amp;quot; and &amp;quot;.join([&amp;quot;, &amp;quot;.join(input[:-1]),input[-1]])+&amp;quot;}&amp;quot;&lt;/p&gt;
&lt;p&gt;... &lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; print f([&amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot;])&lt;/p&gt;
&lt;p&gt;{ABC, DEF, G and H}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553178</link><pubDate>Thu, 16 Apr 2009 20:02:21 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553178</guid><dc:creator>Nick</dc:creator><description>&lt;p&gt;Here is my proposal:&lt;/p&gt;
&lt;p&gt;**********************************************&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.ComponentModel;&lt;/p&gt;
&lt;p&gt;using System.Data;&lt;/p&gt;
&lt;p&gt;using System.Drawing;&lt;/p&gt;
&lt;p&gt;using System.Linq;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;using System.Windows.Forms;&lt;/p&gt;
&lt;p&gt;namespace LippertChallange0415&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public partial class Form1 : Form&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public Form1()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;InitializeComponent();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.Load += new EventHandler(Form_Load);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void Form_Load(object sender, EventArgs e)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder collector = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;collector.Append(GetCommaQuibbledString(new string[] {}));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;collector.Append(&amp;quot;\n&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;collector.Append(GetCommaQuibbledString(new string[] {null, &amp;quot;NICK&amp;quot;, &amp;quot;IS&amp;quot;, &amp;quot;GOOD LOOKING&amp;quot;, &amp;quot;COOL&amp;quot;}));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;collector.Append(&amp;quot;\n&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;collector.Append(GetCommaQuibbledString(new string[] {&amp;quot;PEANUT BUTTER&amp;quot;, &amp;quot;JELLY&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;collector.Append(&amp;quot;\n&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;collector.Append(GetCommaQuibbledString(new string[] {&amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;3&amp;quot;, &amp;quot;4&amp;quot;, &amp;quot;5&amp;quot;, &amp;quot;6&amp;quot;, &amp;quot;7&amp;quot;, &amp;quot;8&amp;quot;, &amp;quot;9&amp;quot;, &amp;quot;10&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;collector.Append(&amp;quot;\n&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MessageBox.Show(collector.ToString());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public string GetCommaQuibbledString(IEnumerable&amp;lt;string&amp;gt; input)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder rtrn = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rtrn.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (input != null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IEnumerator&amp;lt;string&amp;gt; strings = input.GetEnumerator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (strings.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string current = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string next = strings.Current ?? string.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int addedCount = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// keep going as long as we haven't processed the last item&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (next != null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// replace current with next, get the next item&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (strings.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;current = next;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;next = strings.Current ?? string.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// add the appropriate separator (if any)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (addedCount &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rtrn.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;current = next;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;next = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// add the appropriate separator (if any)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (addedCount &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rtrn.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// add the current item&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rtrn.Append(current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;addedCount++;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rtrn.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return rtrn.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553206</link><pubDate>Thu, 16 Apr 2009 20:24:55 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553206</guid><dc:creator>Aaron G</dc:creator><description>&lt;p&gt;Wow, all these insane complicated and long-winded solutions. &amp;nbsp;I hope some people are just trying to be funny. &amp;nbsp;I would use the exact same solution I used before with a small wrinkle:&lt;/p&gt;
&lt;p&gt;StringBuilder sb = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt;string token = null;&lt;/p&gt;
&lt;p&gt;foreach (B item in items)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp;if (sb.Length &amp;gt; 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;sb.Append(token);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;token = item.SomeProperty;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;if (!string.IsNullOrEmpty(token))&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp;if ((sb.Length &amp;gt; 1) &amp;amp;&amp;amp; !string.IsNullOrEmpty(token))&lt;/p&gt;
&lt;p&gt; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;sb.Append(token);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;sb.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt;That's it. &amp;nbsp;No counters, no raw enumeration, no list conversion, no insanity. &amp;nbsp;LINQ is great but I don't think it's appropriate for the problem at hand, performance-wise.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553214</link><pubDate>Thu, 16 Apr 2009 20:30:11 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553214</guid><dc:creator>zz|sergant</dc:creator><description>&lt;p&gt;//------------------------------------------------------------------&lt;/p&gt;
&lt;p&gt;static string Quiz(IEnumerable&amp;lt;string&amp;gt; items)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;var builder = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int counter = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;string prev = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;foreach (var str in items)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (counter++ == 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(str);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (prev != null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(prev);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;prev = str;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (counter &amp;gt; 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(prev);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return String.Concat(&amp;quot;{&amp;quot;, builder.ToString(), &amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553316</link><pubDate>Thu, 16 Apr 2009 21:35:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553316</guid><dc:creator>Mads Houmann</dc:creator><description>&lt;p&gt;static string ConcatStrings(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int i = 0, c = strings.Count();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return strings.Aggregate(new StringBuilder(&amp;quot;{&amp;quot;),&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(b, s) =&amp;gt; i++ == 0 ? b.Append(s) : b.Append(i &amp;lt; c ? &amp;quot;, &amp;quot; : &amp;quot; and &amp;quot;).Append(s),&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b =&amp;gt; b.Append(&amp;quot;}&amp;quot;).ToString());&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553321</link><pubDate>Thu, 16 Apr 2009 21:39:17 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553321</guid><dc:creator>eff Five</dc:creator><description>&lt;p&gt;After implmenting the solution I checked and Yoav Zobel Had the one closet to mine (he chose to check for first rather than clean up aftewards)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string Quibble(IEnumerable&amp;lt;string&amp;gt; words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder builder = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int lastCommaPosition = 0 ;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int penultimateCommaPosition = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string word in words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(word);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;penultimateCommaPosition = lastCommaPosition;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;lastCommaPosition = builder.Length;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Remove the last comma;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lastCommaPosition &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Remove(lastCommaPosition , 2);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Replace the penultimateComma with an and&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (penultimateCommaPosition &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Replace(&amp;quot;,&amp;quot;, &amp;quot; AND&amp;quot;, penultimateCommaPosition, 1);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + builder.ToString() + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553329</link><pubDate>Thu, 16 Apr 2009 21:43:30 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553329</guid><dc:creator>Michael Chermside</dc:creator><description>&lt;p&gt;This one is in Java (but the algorithm is what's important, and the code should be readable to any programmer):&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;/**&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; * This solves the problem described in&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; * &amp;lt;a href=&amp;quot;&lt;a rel="nofollow" target="_new" href="http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx&amp;quot;&amp;gt;Eric"&gt;http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx&amp;quot;&amp;gt;Eric&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; * Lippert's Blog&amp;lt;/a&amp;gt;. It performs in O(N*log(N)) by keeping the collected items with&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; * commas in a StringBuilder (which performs in O(N*log(N)) by maintaining a character array&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; * and re-sizing it on demand to a multiple of its current size) and keeping the last item in&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; * a separate variable and concatenating it at the end.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; * &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; * @param strings an iterable collection of non-null Strings. We are only allowed to iterate this&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; * &amp;nbsp; collection; no other operations are permitted.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; * @return a string which meets the requirements specified in the problem.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; */&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static String solution(Iterable&amp;lt;String&amp;gt; strings) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder commaSeparated = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String lastItem = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (String s : strings) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assert s != null; // the contract guaranteed elements would be non-null&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lastItem != null) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (commaSeparated == null) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// First thing to go in the buffer goes on its own&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;commaSeparated = new StringBuilder(lastItem);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Subsequent things are comma-separated&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;commaSeparated.append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;commaSeparated.append(lastItem);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;lastItem = s;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lastItem == null) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// There were 0 items in the collection&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (commaSeparated == null) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// There was 1 item in the collection&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + lastItem + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// There was more than 1 item in the collection&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + commaSeparated + &amp;quot; and &amp;quot; + lastItem + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553344</link><pubDate>Thu, 16 Apr 2009 21:51:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553344</guid><dc:creator>Jason</dc:creator><description>&lt;p&gt; static string EnglishJoin(IEnumerable&amp;lt;string&amp;gt; ls)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;var result = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;string last = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;int count = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach(var cur in ls)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;count++;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(count &amp;gt; 2)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(count &amp;gt; 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.Append(last);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;last = cur;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(count &amp;gt; 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.Append(last);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553363</link><pubDate>Thu, 16 Apr 2009 22:01:30 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553363</guid><dc:creator>Filini</dc:creator><description>&lt;p&gt;I was looking for a mix between code maintainability and performance, so I tried the following approaches:&lt;/p&gt;
&lt;p&gt;- StupidJoin: create a List from the Enumerable, use a for().&lt;/p&gt;
&lt;p&gt;- StupidJoinOptimized: count the items of the Enumerable, then use foreach() and an index&lt;/p&gt;
&lt;p&gt;- NaiveJoin: build the string with all &amp;quot;,&amp;quot; separators, remember the index of the last one; then, replace the last with &amp;quot; and&amp;quot;&lt;/p&gt;
&lt;p&gt;- GetCombined: Rick Dailey method&lt;/p&gt;
&lt;p&gt;- GetCombinedOptimized: Rick Dailey method, with a &amp;quot;first&amp;quot; boolean, to avout calculating builder.Length at each loop&lt;/p&gt;
&lt;p&gt;All methods use a StringBuilder.&lt;/p&gt;
&lt;p&gt;For a small array, repeated many times, I got my expected results (small increase with each optimization):&lt;/p&gt;
&lt;p&gt;================================================================&lt;/p&gt;
&lt;p&gt;40 ARRAY ITEMS, 3000000 TIMES&lt;/p&gt;
&lt;p&gt;================================================================&lt;/p&gt;
&lt;p&gt;3000000 StupidJoin done in 22143 ms&lt;/p&gt;
&lt;p&gt;================================================================&lt;/p&gt;
&lt;p&gt;3000000 StupidJoinOptimized done in 21115 ms (5% time saved) SMALL SAVE&lt;/p&gt;
&lt;p&gt;================================================================&lt;/p&gt;
&lt;p&gt;NaiveJoin benchmark&lt;/p&gt;
&lt;p&gt;3000000 NaiveJoin done in 18427 ms (17% time saved) MY IDEA, NICE SAVE&lt;/p&gt;
&lt;p&gt;================================================================&lt;/p&gt;
&lt;p&gt;3000000 GetCombined done in 14874 ms (33% time saved) YEP, RICK DAILEY IS SMARTER...&lt;/p&gt;
&lt;p&gt;================================================================&lt;/p&gt;
&lt;p&gt;3000000 GetCombinedOptimized done in 14484 ms (35% time saved) ...BUT CAN BE OPTIMIZED&lt;/p&gt;
&lt;p&gt;Then I tried a very long array, looped a few times, and the results were different!&lt;/p&gt;
&lt;p&gt;================================================================&lt;/p&gt;
&lt;p&gt;4000 ARRAY ITEMS, 30000 TIMES&lt;/p&gt;
&lt;p&gt;================================================================&lt;/p&gt;
&lt;p&gt;30000 StupidJoin done in 29132 ms&lt;/p&gt;
&lt;p&gt;================================================================&lt;/p&gt;
&lt;p&gt;30000 StupidJoinOptimized done in 13430 ms (54% time saved) WTF! THE STUPID APPROACH CAN BE FASTER THAN RICK DAILEY GETCOMBINED&lt;/p&gt;
&lt;p&gt;================================================================&lt;/p&gt;
&lt;p&gt;30000 NaiveJoin done in 16031 ms (45% time saved)&lt;/p&gt;
&lt;p&gt;================================================================&lt;/p&gt;
&lt;p&gt;30000 GetCombined done in 13698 ms (53% time saved)&lt;/p&gt;
&lt;p&gt;================================================================&lt;/p&gt;
&lt;p&gt;30000 GetCombinedOptimized done in 12938 ms (56% time saved)&lt;/p&gt;
&lt;p&gt;These calls were made without actually assigning the method result to a variable. Assigning the result to a variable, actually gave totally different results (still have to dig into that).&lt;/p&gt;
&lt;p&gt;If you're interested, here is the code of the methods:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static string StupidJoin(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;string&amp;gt; list = new List&amp;lt;string&amp;gt;(strings);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int total = list.Count;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int n = 0; n &amp;lt; total; n++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (n == total - 1) sb.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if(n &amp;gt; 0 ) sb.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(list[n]);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static string StupidJoinOptimized(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int total = strings.Count();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int n = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string s in strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (n == total - 1) sb.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if (n &amp;gt; 0) sb.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(s);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;n++;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static string NaiveJoin(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bool first = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int lastComma = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int lastLength = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string s in strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;lastLength = s.Length;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!first)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;lastComma += lastLength + 2;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(s);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;first = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lastComma &amp;gt; 0) lastComma--;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lastComma == 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.ToString().Remove(lastComma, 1).Insert(lastComma, &amp;quot; and&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string GetCombined(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string opening = &amp;quot;{&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var builder = new StringBuilder(opening);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var enumerator = strings.GetEnumerator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bool hasNext = enumerator.MoveNext();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (hasNext)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string s = enumerator.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;hasNext = enumerator.MoveNext();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (builder.Length &amp;gt; opening.Length) // after the opening curly brace&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(hasNext ? &amp;quot;, &amp;quot; : &amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(s);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append('}');&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return builder.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string GetCombinedOptimized(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string opening = &amp;quot;{&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var builder = new StringBuilder(opening);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var enumerator = strings.GetEnumerator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bool hasNext = enumerator.MoveNext();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bool first = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (hasNext)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string s = enumerator.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;hasNext = enumerator.MoveNext();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!first) // after the opening curly brace&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(hasNext ? &amp;quot;, &amp;quot; : &amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(s);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;first = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append('}');&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return builder.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553376</link><pubDate>Thu, 16 Apr 2009 22:09:38 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553376</guid><dc:creator>SteveEisner</dc:creator><description>&lt;p&gt;@Aaron G - cocky, or cockup? &amp;nbsp; did you test it? :)&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553379</link><pubDate>Thu, 16 Apr 2009 22:13:42 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553379</guid><dc:creator>SteveEisner</dc:creator><description>&lt;p&gt;@Filini - glad to see someone checking perf :) &amp;nbsp;I think your GetCombinedOptimized is the same as my solution? &amp;nbsp;But much prettier!&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553381</link><pubDate>Thu, 16 Apr 2009 22:13:55 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553381</guid><dc:creator>Jon Skeet</dc:creator><description>&lt;p&gt;@Aaron G: It's clearly a personal matter - I found your solution somewhat harder to understand than many of the others, due to always using the token in the iteration *after* it's retrieved, so on the first iteration you end up with sb.Append(null) - and mentally checking that yes, this does do nothing.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553386</link><pubDate>Thu, 16 Apr 2009 22:15:54 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553386</guid><dc:creator>SteveEisner</dc:creator><description>&lt;p&gt;oops. submitted too fast. &amp;nbsp;@Filini - StupidJoinOptimized might be fast in your tests because by passing an array you gave it something with an optimized &amp;quot;.Count()&amp;quot; method. &amp;nbsp;Try the tests with something that actually has to calculate &amp;amp; yield each word...&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553394</link><pubDate>Thu, 16 Apr 2009 22:18:59 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553394</guid><dc:creator>SteveEisner</dc:creator><description>&lt;p&gt;@Jon Skeet - ah, interesting, sb.Append(null) works ... that's exactly what I was wondering in my previous comment!&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553402</link><pubDate>Thu, 16 Apr 2009 22:25:17 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553402</guid><dc:creator>Eff Five</dc:creator><description>&lt;p&gt;I noticed that several people mentioned that terseness is unequivocally the same as readability. I’m extremely happy to see people refute the statement from the NASA Software Assurance Technology Center “Modules with low size and high complexity are also a reliability risk because they tend to be very terse code, which is difficult to change or modify”&lt;/p&gt;
&lt;p&gt;I mean after all anyone can tell what the following regular expression is supposed to do and were the obvious defect is&lt;/p&gt;
&lt;p&gt;All due of course to its terseness&lt;/p&gt;
&lt;p&gt;(?&amp;amp;lt;HTML&amp;amp;gt;&amp;amp;lt;a[^&amp;amp;gt;]*href\s*=\s*[\&amp;amp;quot;\']?(?&amp;amp;lt;HRef&amp;amp;gt;[^&amp;amp;quot;'&amp;amp;gt;\s]*)[\&amp;amp;quot;\']?[^&amp;amp;gt;]*(?&amp;amp;lt;Title&amp;amp;gt;[^&amp;amp;lt;]+|.*?)?&amp;amp;lt;/a\s*&amp;amp;gt;)&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553413</link><pubDate>Thu, 16 Apr 2009 22:30:11 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553413</guid><dc:creator>Juozas Kontvainis</dc:creator><description>&lt;p&gt;After reading some of the answers I got an idea to add item to the list only after separator to be used is known. And to do that by delayed evaluation. Since I thought it would be a great exercise for me to learn a bit about delegate magic, I went implemented my idea.&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;namespace NoOxfordComma&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;class Program&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string NoOxfordComma(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder englishList = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Action&amp;lt;string, string&amp;gt; addToList = (separator, item) =&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;englishList = englishList == null ?&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new StringBuilder().Append(item) :&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;englishList.Append(separator).Append(item);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Func&amp;lt;string, Action&amp;lt;string&amp;gt;&amp;gt; addItem = (item) =&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(separator) =&amp;gt; addToList(separator, item);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Action&amp;lt;string&amp;gt; addSeparator = (s) =&amp;gt; { };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string s in strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;addSeparator(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;addSeparator = addItem(s);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;addSeparator(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + englishList + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(NoOxfordComma(new string[] { }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(NoOxfordComma(new string[] { &amp;quot;ABC&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(NoOxfordComma(new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(NoOxfordComma(new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(NoOxfordComma(new string[] { &amp;quot;{&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;and&amp;quot;, &amp;quot;}&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.ReadKey();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553465</link><pubDate>Thu, 16 Apr 2009 23:35:07 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553465</guid><dc:creator>Zak</dc:creator><description>&lt;p&gt;Here is my quick effort, before I posted I had a quick look at the other offerings and not surprisingly has more or less &amp;nbsp;been posted already.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string lastWord = string.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder result = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string word in words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(result.Length!=1) result.Append(&amp;quot;,&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.Append(lastWord);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;lastWord = word;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (result.Length != 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.Append(lastWord);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553467</link><pubDate>Thu, 16 Apr 2009 23:37:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553467</guid><dc:creator>Aaron G</dc:creator><description>&lt;p&gt;@SteveEisner: Yes, I did test it, for 0, 1, 2, and 3 entries. &amp;nbsp;Did you find a problem?&lt;/p&gt;
&lt;p&gt;@Jon Skeet: I actually thought yours was fine, aside from requiring an additional variable and a few more lines of code. &amp;nbsp;The important thing to me was to iterate only once, guarantee a correct result, and minimize the number of assignments and checks *inside* the loop, because Eric said it could be an arbitrarily-long list of items. &amp;nbsp;I suppose I also could have made mine a little more readable by using the variable name &amp;quot;previousToken&amp;quot; instead of just &amp;quot;token&amp;quot;.&lt;/p&gt;
&lt;p&gt;In my experience at least, minimizing state is as important as minimizing code size and nesting. &amp;nbsp;Mentally tracking state involves memory and is thus a lot harder than mentally following a code path. &amp;nbsp;I realize I've only used one fewer variable than you have, and there weren't that many to begin with, but it's still one fewer ball for some other poor developer to have to juggle around in his head. ;)&lt;/p&gt;
&lt;p&gt;I was really expressing my horror at all the abuse of recursion, the Reverse function, unit tests (!), string.Replace, list creation, etc. &amp;nbsp;Even using the raw enumerator is better; at least it maintains some reasonable balance of performance -and- readability. &amp;nbsp;I love Generics and Linq, but sometimes less is more.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553524</link><pubDate>Fri, 17 Apr 2009 00:40:03 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553524</guid><dc:creator>Todd</dc:creator><description>&lt;p&gt;Sam... actually I was just saying Count() is cheaper regardless of the underlying class behind the enumerable. &amp;nbsp;Counting once, building a new list of *most* items once, all adds up to an efficient solution... in my opinion.&lt;/p&gt;
&lt;p&gt;As far as terseness... I just like terseness, but I don't assume that greater terseness == greater readability for everybody.&lt;/p&gt;
&lt;p&gt;Filini... that looks pretty thorough. &amp;nbsp;Can you include some variations that don't use StringBuilder? &amp;nbsp;Specifically I mean options that use string.Join(...). &amp;nbsp;I'm just curious.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553557</link><pubDate>Fri, 17 Apr 2009 01:28:33 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553557</guid><dc:creator>Eber Irigoyen</dc:creator><description>&lt;p&gt;static string JoinStrings(IEnumerable&amp;lt;string&amp;gt; strings) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int len = strings.Count();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return len == 0 ? &amp;quot;{}&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: len == 1 ? &amp;quot;{&amp;quot;+strings.First()+&amp;quot;}&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: &amp;quot;{&amp;quot;+strings.Take(len - 1).Aggregate((string head, string tail) =&amp;gt; head+&amp;quot;, &amp;quot;+tail)+&amp;quot; and &amp;quot; +strings.Last()+&amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>Unir cadenas con comas</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553558</link><pubDate>Fri, 17 Apr 2009 01:29:12 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553558</guid><dc:creator>¿Qué quieres desarrollar hoy?</dc:creator><description>&lt;p&gt;Hace unos dias Eric publico un problema , al principio me dio flojera responderlo, pero al ver el numero&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553562</link><pubDate>Fri, 17 Apr 2009 01:35:41 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553562</guid><dc:creator>ptoniolo</dc:creator><description>&lt;p&gt;Some considerations...&lt;/p&gt;
&lt;p&gt;Most of the solutions involving the conversion to arrays or lists are dangerous; the enumeration doesn't even require the objects enumerated to be in memory: they could be picked one by one from a pipeline, or from a database table. In that case, using a list requires at least a double size for the memory requirements, and for a problem stated for a finite number of values, but maybe very big, I think this is very dangerous. Moreover, to build a list, the system has to enumerate the elements, and thus the extra time needed to enumerate again the list elements is too much. The only advantage could be that, if the Join() method is written in some machinecode, it can be much better than the enumeration. But I think that a real implementation of Join() in the fw uses c# code (I have to check the library with reflector), and thus it will have to enumerate the list again!&lt;/p&gt;
&lt;p&gt;The same space problem affects the naive string concatenations. You can suppose that an operation like longstring+=&amp;quot;,&amp;quot; requires a space on the heap allocated for double the size of longstring. If longstring is 100Mb, you will neet twice that much for a fraction of a second. Maybe the compiler/optimizer can fix your problem, but I don't think a program used as a sample should rely on that. A stringbuilder is definitely needed.&lt;/p&gt;
&lt;p&gt;Another problem with most of the algorithms I see here, is that they use a lot of backtracking, like using the stringbuilder contents as an input, i.e., I don't think that code like if(sb.Length) is &amp;quot;elegant&amp;quot;: if you can build an algorithm that does not do anything more than needed, this is the best way. If I use a correct algorithm, I am expected to already know what I have done some lines of code behind! Moreover, in general I am sure it is better to use a local boolean, normally implemented on the stack or even in a machine registry, instead of calling a class methid or property: you can never know what's exactly behind any method invocation.&lt;/p&gt;
&lt;p&gt;I think, but I did not try it, that doing sb.Append(&amp;quot;, &amp;quot;).Append(item) is quicker than sb.AppendFormat(&amp;quot;, {0}&amp;quot;,item): it does not need to parse a format string, even if it calls a method twice (overhead). This is the only optimization I think that my solution needs. It is somewhat less readable, maybe, but it is enough so to suggest this style.&lt;/p&gt;
&lt;p&gt;But, apart from that optimization, I think that my solution is still nice: it uses the input list only with the minimum set of methods from IEnumerator, namely MoveNext and Current, and uses a stringbuilder only as an output stream/pipeline: Append (and AppendFormat in the original version) and the obvious ToString() to extract the result. This means that the same solution could be used to build a gigafile, just by appending on it (stringbuilder is a metaphor for any output pipe!) from a database table with millions of rows, exposed to your code with IEnumerable. I think my solution is the only one that can efficiently solve a problem like this! Only three variables are used: the stringbuilder, the unavoidable enumerator (even with a foreach the IL will need it!) and a string to apply the last-but-one approach to avoid the backtracking many others used to substitute the &amp;quot;and&amp;quot; for the last comma, solution that I find really awkward! The fact that all the variables could be declared with the var-syntax is also a nice feature: I have not used it in the code posted, to allow an implementation with older versione of the fw.&lt;/p&gt;
&lt;p&gt;If you follow the execution of the algorithm, I think you can easily see that the steps taken during the run time are the minimum required for the job to be done&lt;/p&gt;
&lt;p&gt;Ciao&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553571</link><pubDate>Fri, 17 Apr 2009 02:01:37 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553571</guid><dc:creator>Delay</dc:creator><description>&lt;p&gt;/// &amp;lt;summary&amp;gt;&lt;/p&gt;
&lt;p&gt;/// Solve comma quibbling posed by Eric Lippert at:&lt;/p&gt;
&lt;p&gt;/// &lt;a rel="nofollow" target="_new" href="http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx"&gt;http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;/// &amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;/// &amp;lt;typeparam name=&amp;quot;T&amp;quot;&amp;gt;Type of input.&amp;lt;/typeparam&amp;gt;&lt;/p&gt;
&lt;p&gt;/// &amp;lt;param name=&amp;quot;input&amp;quot;&amp;gt;Stream of input elements (ex: string).&amp;lt;/param&amp;gt;&lt;/p&gt;
&lt;p&gt;/// &amp;lt;returns&amp;gt;Quibbled string.&amp;lt;/returns&amp;gt;&lt;/p&gt;
&lt;p&gt;/// &amp;lt;remarks&amp;gt;&lt;/p&gt;
&lt;p&gt;/// Good points:&lt;/p&gt;
&lt;p&gt;/// * Generic type support (StringBuilder formats for output)&lt;/p&gt;
&lt;p&gt;/// * Special-case logic is not run every time through the loop&lt;/p&gt;
&lt;p&gt;/// Bad points:&lt;/p&gt;
&lt;p&gt;/// * Input stream is traversed three times :(&lt;/p&gt;
&lt;p&gt;/// &amp;lt;/remarks&amp;gt;&lt;/p&gt;
&lt;p&gt;private static string CommaQuibbling&amp;lt;T&amp;gt;(IEnumerable&amp;lt;T&amp;gt; input)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;// Capture stream&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;var a = input.GetEnumerator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;var b = input.Skip(1).GetEnumerator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;var c = input.Skip(2).GetEnumerator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;// Prefix the result&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;var sb = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;// Process the &amp;quot;normal&amp;quot; leading elements&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;while (c.MoveNext() &amp;amp;&amp;amp; b.MoveNext() &amp;amp;&amp;amp; a.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(a.Current).Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;// Process the non-Oxford comma scenario&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (b.MoveNext() &amp;amp;&amp;amp; a.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(a.Current).Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;// Process the remaining element&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (a.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(a.Current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;// Postfix the result and return it&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return sb.Append(&amp;quot;}&amp;quot;).ToString();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553575</link><pubDate>Fri, 17 Apr 2009 02:08:06 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553575</guid><dc:creator>Todd</dc:creator><description>&lt;p&gt;ptoniolo... you're right, of course. &amp;nbsp;Eric didn't mention any performance requirements, however, so I'm inclined to go with whatever is the most clear and elegant. &amp;nbsp;But, with that being said, my earlier posts with Count() and ToArray()'s would be dreadfully slow.&lt;/p&gt;
&lt;p&gt;But this would be faster:&lt;/p&gt;
&lt;p&gt;string CommaQuibble(IEnumerable&amp;lt;string&amp;gt; words)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder(100);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;string lastWord = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;int count = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string word in words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (count &amp;gt; 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lastWord != null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(lastWord);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;lastWord = word;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;count++;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (count &amp;gt; 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lastWord != null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(lastWord);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.ToString();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553585</link><pubDate>Fri, 17 Apr 2009 02:13:38 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553585</guid><dc:creator>ptoniolo</dc:creator><description>&lt;p&gt;Delay, It took a while for me to understand that you rely on the short-circuiting of the &amp;quot;&amp;amp;&amp;amp;&amp;quot; operator.&lt;/p&gt;
&lt;p&gt;I am sure the triple pass over the input stream is awful, but the solution is somewhat nice, amusing!&lt;/p&gt;
</description></item><item><title>Comma quibbling a la Eric and Jafar [A slightly wacky approach to the problem in C#]</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553600</link><pubDate>Fri, 17 Apr 2009 02:30:40 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553600</guid><dc:creator>Delay's Blog</dc:creator><description>&lt;p&gt;Jafar was teasing me about his F# solution to Eric Lippert's comma quibbling problem , and I decided&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553625</link><pubDate>Fri, 17 Apr 2009 02:56:19 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553625</guid><dc:creator>Jafar Husain</dc:creator><description>&lt;p&gt;Hey Nick,&lt;/p&gt;
&lt;p&gt;Very nice but I think using the power pack is cheating a little. :-)&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553675</link><pubDate>Fri, 17 Apr 2009 03:58:41 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553675</guid><dc:creator>Denis</dc:creator><description>&lt;p&gt;Oops. I have posted my solution a while ago, but then realised most of the others are trying to tackle the problem of the strings containing commas and curly brackets.&lt;/p&gt;
&lt;p&gt;I did notice the mentioning that the strins MAY contain anything, including commas and brackets, but nothing tells me what the resulting string should look like, if they do; so my solution just does not bother checking -- too bad for me... :-)&lt;/p&gt;
&lt;p&gt;Then again: I just keep remembering that pop culture expression, about whose mother assumption is, and try not to assume anything, unless I have to.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553725</link><pubDate>Fri, 17 Apr 2009 05:33:51 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553725</guid><dc:creator>Christina Helton</dc:creator><description>&lt;p&gt;This was a lot of fun, by the way. &amp;nbsp;I love learning new ways to do things and how to do them more efficiently. &amp;nbsp;I hope you enjoy my solution.&lt;/p&gt;
&lt;p&gt;The first portion of this is a method to parse the IEnumerable&amp;lt;string&amp;gt; parameter sent in. &amp;nbsp;I did not add any comments here as I *love* comments and I wanted to just show the main functionality first to see if it would be considered readable without the comments. &amp;nbsp;I will post the portion with comments below it.&lt;/p&gt;
&lt;p&gt;public static string ParseStrings(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;	string begin = &amp;quot;{&amp;quot;;&lt;/p&gt;
&lt;p&gt;	string end = &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt;	string body = String.Empty;&lt;/p&gt;
&lt;p&gt;	if (strings.Count() &amp;gt; 1)&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;		begin += strings.First();&lt;/p&gt;
&lt;p&gt;		end = &amp;quot; and &amp;quot; + strings.Last() + end;&lt;/p&gt;
&lt;p&gt;		if (strings.Count() &amp;gt; 2)&lt;/p&gt;
&lt;p&gt;		{&lt;/p&gt;
&lt;p&gt;			foreach (string item in strings)&lt;/p&gt;
&lt;p&gt;			{&lt;/p&gt;
&lt;p&gt;				if (item != strings.First() &amp;amp;&amp;amp; item != strings.Last()) body += &amp;quot;,&amp;quot; + item;&lt;/p&gt;
&lt;p&gt;			}&lt;/p&gt;
&lt;p&gt;		}&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;	else body += strings.SingleOrDefault&amp;lt;string&amp;gt;(); &lt;/p&gt;
&lt;p&gt;	return begin + body + end;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;This second portion is the entire class. &amp;nbsp;I like playing with new things as I said, so I created a C# extension called CreateDelimitedList that will convert an IEnumerable&amp;lt;string&amp;gt; list to this new format. &amp;nbsp;Then I created a few lists to test against. &amp;nbsp;I ran them first through a method that returns the result of the extension, and then one that runs it directly through the extension. &amp;nbsp;Even though I used List&amp;lt;string&amp;gt; in the method where this is being called, I made sure that the parameter that the actual code was being parsed against was IEnumerable&amp;lt;string&amp;gt;. &amp;nbsp;Here is the entire solution below (remember I *love* commenting).&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Linq;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;namespace CommaQuibbling&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;class Program&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Make some lists for testing purposes &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;List&amp;lt;string&amp;gt;&amp;gt; parsedLists = new List&amp;lt;List&amp;lt;string&amp;gt;&amp;gt;()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new List&amp;lt;string&amp;gt;(),&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new List&amp;lt;string&amp;gt;() {&amp;quot;a&amp;quot;},&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new List&amp;lt;string&amp;gt;() { &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot; },&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new List&amp;lt;string&amp;gt;() { &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot; },&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new List&amp;lt;string&amp;gt;() { &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;},&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new List&amp;lt;string&amp;gt;() { &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//parse each list by method&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(&amp;quot;Parse by method&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (List&amp;lt;string&amp;gt; list in parsedLists)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(ParseStrings(list));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//parse each list by extension&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(&amp;quot;Parse by extension&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (List&amp;lt;string&amp;gt; list in parsedLists)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(list.CreateDelimitedList());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.ReadKey();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string ParseStrings(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//use the extension here -- the code in the extension could be moved here&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//to perform the same thing&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return strings.CreateDelimitedList();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static class IEnumerableExtensions&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string CreateDelimitedList(this IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//create the begin and end string which will aways be the opening and closing bracket&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string begin = &amp;quot;{&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string end = &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//this will contain the middle portion of the string&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string body = String.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//if the string count is great than 1&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//if it is the only item add it to body&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//if there are no strings, it will bring back an empty string&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (strings.Count() &amp;gt; 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//get the first string and the last string&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//putting the and before the last string item will ensure the last comma&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//wont become an issue because you can then put the comma before the 'body' item&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;begin += strings.First();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;end = &amp;quot; and &amp;quot; + strings.Last() + end;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (strings.Count() &amp;gt; 2)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string item in strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//if it is not the first or last item add the item in with a comma before it&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (item != strings.First() &amp;amp;&amp;amp; item != strings.Last()) body += &amp;quot;,&amp;quot; + item;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else body += strings.SingleOrDefault&amp;lt;string&amp;gt;(); &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return begin + body + end;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553728</link><pubDate>Fri, 17 Apr 2009 05:41:56 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553728</guid><dc:creator>The First Nick</dc:creator><description>&lt;P&gt;I'm curious now... How are some people getting their code to be displayed without double newlines everywhere? &amp;nbsp;Most seem to be formatted badly, but there are several by different people that look right.&lt;/P&gt;
&lt;DIV class=yellowbox&gt;I'm fixing them manually with my comment editing tools. Apparently I'm drinking from a fire hose of solutions here. It'll take a while to get to them all. This has turned out to be a more popular pasttime than I anticipated! -- Eric &lt;/DIV&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553730</link><pubDate>Fri, 17 Apr 2009 05:42:31 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553730</guid><dc:creator>Christina Helton</dc:creator><description>&lt;p&gt;*le sigh* I realized the first portion of code lost its form (indentation and such) and that bothers me, but the premise is there. ;)&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553738</link><pubDate>Fri, 17 Apr 2009 05:54:51 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553738</guid><dc:creator>Christina Helton</dc:creator><description>&lt;p&gt;Oh I also wanted to note that in my code I used the IEnumerable&amp;lt;T&amp;gt;.Count() which returns an int32, however if the list is going to be *really* long as was hinted at in the information above then there is a IEnumerable&amp;lt;T&amp;gt;.LongCount() that can be used which brings back an int64 instead.&lt;/p&gt;
&lt;p&gt;(See this article for more : &lt;a rel="nofollow" target="_new" href="http://msdn.microsoft.com/en-us/library/bb338038"&gt;http://msdn.microsoft.com/en-us/library/bb338038&lt;/a&gt;(VS.95).aspx)&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553837</link><pubDate>Fri, 17 Apr 2009 07:55:51 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553837</guid><dc:creator>Steve Wagner</dc:creator><description>&lt;p&gt;Of course the Stack-derived nonsense was completely nonsensical:&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Linq;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;using NUnit.Framework;&lt;/p&gt;
&lt;p&gt;namespace CommaQuibble&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;[TestFixture]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public class QuibblerFixture&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void EmptyList()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IEnumerable&amp;lt;string&amp;gt; list = new[] {&amp;quot;&amp;quot;};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string quibbled = GetQuibbled(list);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.AreEqual(&amp;quot;{}&amp;quot;, quibbled);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static string GetQuibbled(IEnumerable&amp;lt;string&amp;gt; list)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Quibbler quibbler = new Quibbler();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return quibbler.Quibble(list);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void OneItemInList()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IEnumerable&amp;lt;string&amp;gt; list = new[] {&amp;quot;ABC&amp;quot;};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string quibbled = GetQuibbled(list); &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.AreEqual(&amp;quot;{ABC}&amp;quot;, quibbled);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void TwoItemsInList()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[] list = new[] { &amp;quot;ABC&amp;quot;, &amp;quot;DE&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string quibbled = GetQuibbled(list);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.AreEqual(&amp;quot;{ABC and DE}&amp;quot;, quibbled);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void ThreeItemsInList()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[] list = new[] { &amp;quot;ABC&amp;quot;, &amp;quot;DE&amp;quot;, &amp;quot;ZYXWV&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string quibbled = GetQuibbled(list);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.AreEqual(&amp;quot;{ABC, DE and ZYXWV}&amp;quot;, quibbled);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void ManyMany()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[] list = new[] { &amp;quot;ABC&amp;quot;, &amp;quot;DE&amp;quot;, &amp;quot;ZYXWV&amp;quot;, &amp;quot;FG&amp;quot;, &amp;quot;UT&amp;quot;, &amp;quot;HI&amp;quot;, &amp;quot;SR&amp;quot;, &amp;quot;JK&amp;quot;, &amp;quot;QP&amp;quot;, &amp;quot;LM&amp;quot;, &amp;quot;NO&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string quibbled = GetQuibbled(list);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.AreEqual(&amp;quot;{ABC, DE, ZYXWV, FG, UT, HI, SR, JK, QP, LM and NO}&amp;quot;, quibbled);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void FarTooMany()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[] list = new[] { &amp;quot;yhgv&amp;quot;, &amp;quot;dsfgdsfgth&amp;quot;, &amp;quot;adfg&amp;quot;, &amp;quot;gtdfgt&amp;quot;, &amp;quot;ag&amp;quot;, &amp;quot;wrgsd&amp;quot;, &amp;quot;gbtshgrty&amp;quot;, &amp;quot;faevest&amp;quot;, &amp;quot;htsbvtc&amp;quot;, &amp;quot;hyryhcwtc&amp;quot;, &amp;quot;cwtrchrsth&amp;quot;, &amp;quot;qegsdf&amp;quot;, &amp;quot;wruutyu&amp;quot;, &amp;quot;w465tw&amp;quot;, &amp;quot;cfgwdfg45&amp;quot;, &amp;quot;fydw45fhw46&amp;quot;, &amp;quot;wfywc546jh&amp;quot;, &amp;quot;se5ys5ryhserh&amp;quot;, &amp;quot;gvw46w6thdrtg&amp;quot;, &amp;quot;ygsve54&amp;quot;, &amp;quot;esy6&amp;quot;, &amp;quot;5yfwcwerst&amp;quot;, &amp;quot;rtugfwjuej&amp;quot;, &amp;quot;sfv6jusrt&amp;quot;, &amp;quot;s34etyva35y&amp;quot;, &amp;quot;gyuiu87jdr&amp;quot;, &amp;quot;gacegrasecgra&amp;quot;, &amp;quot;e5h&amp;quot;, &amp;quot;c5yw46h&amp;quot;, &amp;quot;w5w46fyw45y&amp;quot;, &amp;quot;wqf45ywe6fy&amp;quot;, &amp;quot;fw45yw4y6w6u&amp;quot;, &amp;quot;sw345f&amp;quot;, &amp;quot;w45yf&amp;quot;, &amp;quot;cvhwrthcwtr&amp;quot;, &amp;quot;aery&amp;quot;, &amp;quot;chwrthwrtc&amp;quot;, &amp;quot;chq4t6h&amp;quot;, &amp;quot;se4rtvcw5&amp;quot;, &amp;quot;gcr&amp;quot;, &amp;quot;cfw4gfw&amp;quot;, &amp;quot;fgw456y&amp;quot;, &amp;quot;df6w4&amp;quot;, &amp;quot;dfqc4wh6f57fjhf&amp;quot;, &amp;quot;q354fq54y&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string quibbled = GetQuibbled(list);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.AreEqual(&amp;quot;{yhgv, dsfgdsfgth, adfg, gtdfgt, ag, wrgsd, gbtshgrty, faevest, htsbvtc, hyryhcwtc, cwtrchrsth, qegsdf, wruutyu, w465tw, cfgwdfg45, fydw45fhw46, wfywc546jh, se5ys5ryhserh, gvw46w6thdrtg, ygsve54, esy6, 5yfwcwerst, rtugfwjuej, sfv6jusrt, s34etyva35y, gyuiu87jdr, gacegrasecgra, e5h, c5yw46h, w5w46fyw45y, wqf45ywe6fy, fw45yw4y6w6u, sw345f, w45yf, cvhwrthcwtr, aery, chwrthwrtc, chq4t6h, se4rtvcw5, gcr, cfw4gfw, fgw456y, df6w4, dfqc4wh6f57fjhf and q354fq54y}&amp;quot;, quibbled);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void ViacheslavIvanov()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[] list = new[] { &amp;quot;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;}&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string quibbled = GetQuibbled(list);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.AreEqual(&amp;quot;{, , and }}&amp;quot;, quibbled);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public class Quibbler&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public string Quibble(IEnumerable&amp;lt;string&amp;gt; enumerable)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder builder = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string last = enumerable.Last();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string first = enumerable.First();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(first == last)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(first);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if(first != last)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IEnumerable&amp;lt;string&amp;gt; rest = enumerable.Except(new[] { last });&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string penultimate = rest.Last();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string item in rest)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(item);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (item != penultimate)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.AppendFormat(&amp;quot; and {0}&amp;quot;, last);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return builder.ToString(); &amp;nbsp; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553902</link><pubDate>Fri, 17 Apr 2009 09:15:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553902</guid><dc:creator>Steve Wagner</dc:creator><description>&lt;p&gt;Eric, you're really going to go through all of these? Do you sleep?&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553912</link><pubDate>Fri, 17 Apr 2009 09:28:24 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553912</guid><dc:creator>Martin O'keefe</dc:creator><description>&lt;p&gt;Have I read all these - not a chance - so if you have read this far I hope this provides something extra :-). Too much free time people :-).&lt;/p&gt;
&lt;p&gt;class Program&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IEnumerable&amp;lt;string&amp;gt; items = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;items = new String[] { &amp;quot;A&amp;quot;};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PrintOutput(items);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;items = new String[] { &amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PrintOutput(items);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;items = new String[] { &amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PrintOutput(items);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;items = new String[] { &amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;D&amp;quot;, &amp;quot;X&amp;quot;, &amp;quot;DEF&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PrintOutput(items);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.ReadLine();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static void PrintOutput(IEnumerable&amp;lt;string&amp;gt; items)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder(60); //. Arbitrary value that would be determined based on best guess at most common volume.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 1. Always output initial curly brace.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IEnumerator&amp;lt;string&amp;gt; enumerator = items.GetEnumerator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[] buffer = new string[3];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int ordinal = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (enumerator.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;buffer[ordinal] = enumerator.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ordinal++;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (ordinal == buffer.Length)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Note: If I just output the first item then I know I have at least two more to output.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.AppendFormat(&amp;quot;{0}, &amp;quot;, buffer[0]);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Array.ConstrainedCopy(buffer, 1, buffer, 0, 2);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;buffer[2] = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ordinal--;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (ordinal == 1) // I have one to output&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(buffer[0]);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if (ordinal == 2) // I have two to output&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.AppendFormat(&amp;quot;{0} and {1}&amp;quot;, buffer[0], buffer[1]);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else // there be three&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.AppendFormat(&amp;quot;{0}, {1} and {2}&amp;quot;, buffer[0], buffer[1], buffer[2]);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Always output final curly brace.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Wouldn't do this - provided for example review.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(string.Format(&amp;quot;Source data : {0}&amp;quot;, string.Join(&amp;quot;, &amp;quot;, items.ToArray())));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Display result.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(sb.ToString());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553915</link><pubDate>Fri, 17 Apr 2009 09:32:50 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553915</guid><dc:creator>Saw</dc:creator><description>&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string ConcatString(IEnumerable&amp;lt;string&amp;gt; words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string result = string.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[] temp = words.ToArray();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = temp.Length; i &amp;gt; 0; i--)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (i == 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result += temp[temp.Length - i];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if (i == 2)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result += temp[temp.Length - i] + &amp;quot; and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result += temp[temp.Length - i] + &amp;quot;, &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + result + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553918</link><pubDate>Fri, 17 Apr 2009 09:36:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553918</guid><dc:creator>martin O'Keefe</dc:creator><description>&lt;p&gt;Whoops needs to handle the first case.&lt;/p&gt;
&lt;p&gt;correction -&lt;/p&gt;
&lt;p&gt;else if // there be three &lt;/p&gt;
&lt;p&gt;should be&lt;/p&gt;
&lt;p&gt;else if (ordinal == 3)&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553931</link><pubDate>Fri, 17 Apr 2009 09:55:10 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553931</guid><dc:creator>Branislav Opacic</dc:creator><description>&lt;p&gt;Well...&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public string GetConcatenated(IEnumerable&amp;lt;string&amp;gt; strings) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string result = &amp;quot;&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[] list = strings.ToArray();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int length = list.Length;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(int i=0;i&amp;lt;length;i++) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(result.Length &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(i == length-1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result +=&amp;quot; and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result +=&amp;quot;, &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result += list[i];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + result + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553947</link><pubDate>Fri, 17 Apr 2009 10:22:27 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553947</guid><dc:creator>Jagannath</dc:creator><description>&lt;p&gt;namespace SampleApp&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;static class Program&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//string[] s = { &amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C and&amp;quot;, &amp;quot;D&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;,,,,&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//IEnumerable&amp;lt;string&amp;gt; str = s.ToArray().AsEnumerable&amp;lt;string&amp;gt;();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(BuildStringArray().Join(&amp;quot;,&amp;quot;, &amp;quot; and &amp;quot;));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static IEnumerable&amp;lt;string&amp;gt; BuildStringArray()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string alphabets = &amp;quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &amp;nbsp;string[] elements = new string[100];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Random random = new Random(100);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; 10; i++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int min = random.Next(0, 25);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int max = random.Next(min, 25);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return alphabets.Substring(min, max - min + 1);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string Join(this IEnumerable&amp;lt;string&amp;gt; source, &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string delimeter1, &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string delimeter2)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int NumElem = source.Count();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder finalString = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; NumElem -1; i++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;finalString.Append(string.Format(&amp;quot;{0}{1}&amp;quot;, source.ElementAt&amp;lt;string&amp;gt;(i),&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(i + 1 &amp;lt; NumElem -1 ) ? delimeter1 : delimeter2));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (NumElem &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;finalString.Append(source.ElementAt&amp;lt;string&amp;gt;(NumElem - 1)); &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;finalString.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return finalString.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553948</link><pubDate>Fri, 17 Apr 2009 10:23:44 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553948</guid><dc:creator>Branislav Opacic</dc:creator><description>&lt;p&gt;And without array and optimized iterator:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public string GetConcatenated(IEnumerable&amp;lt;string&amp;gt; strings) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string result = &amp;quot;&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int maxIndex = strings.Count() - 1;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(int i=0;i&amp;lt;=maxIndex;i++) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(result.Length &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(i == maxIndex)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result +=&amp;quot; and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result +=&amp;quot;, &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result += strings.ElementAt(i);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + result + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553966</link><pubDate>Fri, 17 Apr 2009 10:50:46 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553966</guid><dc:creator>rbirkby</dc:creator><description>&lt;p&gt;My second attempt. This time with an eye for performance and readability instead of terseness.&lt;/p&gt;
&lt;p&gt;class Program&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;static void Main()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AreEqual(Stringify(new string[] {}), &amp;quot;{}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AreEqual(Stringify(new [] {&amp;quot;ABC&amp;quot; }), &amp;quot;{ABC}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AreEqual(Stringify(new[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; }), &amp;quot;{ABC and DEF}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AreEqual(Stringify(new[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; }), &amp;quot;{ABC, DEF, G and H}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;static string Stringify(IEnumerable&amp;lt;string&amp;gt; sequence)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var cons = new Cons&amp;lt;string&amp;gt;(sequence);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var head = cons.Head().ToArray();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var and = head.Length &amp;gt; 0 ? &amp;quot; and &amp;quot; : string.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + string.Join(&amp;quot;, &amp;quot;, head) + and + cons.Tail + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;static void AreEqual(string actual, string expected)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (actual != expected) throw new Exception(actual + &amp;quot;!=&amp;quot; + expected);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;This iterates the sequence twice, once to generate the array and a second time to join with comma delimiters. However, this solution also needs a Cons class:&lt;/p&gt;
&lt;p&gt;class Cons&amp;lt;T&amp;gt;&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private readonly IEnumerable&amp;lt;T&amp;gt; _sequence;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private T _current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public Cons(IEnumerable&amp;lt;T&amp;gt; sequence)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;_sequence = sequence;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public IEnumerable&amp;lt;T&amp;gt; Head()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IEnumerator&amp;lt;T&amp;gt; enumerator = _sequence.GetEnumerator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (enumerator.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (true)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;_current = enumerator.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!enumerator.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield break;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return _current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public T Tail&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get { return _current; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Yes, the Cons class has some bad API design, but nothing that couldn't be solved without some extra logic.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9553973</link><pubDate>Fri, 17 Apr 2009 11:01:11 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9553973</guid><dc:creator>Abhijeet Patel</dc:creator><description>&lt;p&gt;Here's mine:&lt;/p&gt;
&lt;p&gt;Please replace Words.txt with any file containing words(one word on each line).&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static IEnumerable&amp;lt;string&amp;gt; GetWords()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;using (StreamReader reader = new StreamReader(&amp;quot;Words.txt&amp;quot;))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while(!reader.EndOfStream)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string word = reader.ReadLine();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return word;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield break;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string Concat()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[] excludes = { &amp;quot;,&amp;quot;, &amp;quot;{&amp;quot;, &amp;quot;}&amp;quot;, &amp;quot;&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string str;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IEnumerable&amp;lt;string&amp;gt; words = GetWords().Select(s =&amp;gt; s.Trim()).Except(excludes);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(words.SequenceEqual(Enumerable.Empty&amp;lt;string&amp;gt;()))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;str = &amp;quot;{}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return str;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(words.ElementAtOrDefault(0) != null &amp;amp;&amp;amp; words.ElementAtOrDefault(1) == null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;str = words.SingleOrDefault();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return str;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (words.ElementAtOrDefault(1) != null &amp;amp;&amp;amp; words.ElementAtOrDefault(2) == null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;str = string.Concat(&amp;quot;{&amp;quot;, words.ElementAt(0), &amp;quot; and &amp;quot;, words.ElementAt(1), &amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return str;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string s = words.Aggregate((w1, w2) =&amp;gt; string.Concat(w1, &amp;quot;,&amp;quot;, w2));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(s);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Replace(&amp;quot;,&amp;quot;, &amp;quot; and &amp;quot; , s.LastIndexOfAny(new char[]{','}),1);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;str = sb.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return str;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554000</link><pubDate>Fri, 17 Apr 2009 11:48:37 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554000</guid><dc:creator>Jagannath</dc:creator><description>&lt;p&gt;@Abhijeet &lt;/p&gt;
&lt;p&gt;For the input &amp;nbsp;&lt;/p&gt;
&lt;p&gt;abc&lt;/p&gt;
&lt;p&gt;bca,&lt;/p&gt;
&lt;p&gt;cab}&lt;/p&gt;
&lt;p&gt;bca&lt;/p&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;p&gt;abc,bca,,cab} and bca&lt;/p&gt;
&lt;p&gt;For the input:&lt;/p&gt;
&lt;p&gt;abc&lt;/p&gt;
&lt;p&gt;bca,&lt;/p&gt;
&lt;p&gt;cab}&lt;/p&gt;
&lt;p&gt;bca,&lt;/p&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;p&gt;abc,bca, and cab}&lt;/p&gt;
&lt;p&gt;Is that what you are getting? Is this correct?&lt;/p&gt;
&lt;p&gt;@Eric,&lt;/p&gt;
&lt;p&gt;Could you please let me know if my program is correct? I am wondering whether I understood the problem or not.&lt;/p&gt;
&lt;p&gt;-Jagannath.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554013</link><pubDate>Fri, 17 Apr 2009 12:02:16 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554013</guid><dc:creator>João Angelo</dc:creator><description>&lt;p&gt;I just went for an attempt on readability with no considerations in terms of performance. The solution is based on Jon Skeet approach.&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;namespace CommaQuibbling&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;class Program&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Test();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Test(&amp;quot;ABC&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Test(&amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Test(&amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Test(params string[] words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(BuildWordList(words));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string BuildWordList(IEnumerable&amp;lt;string&amp;gt; words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder list = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Iterate list indexing the last (2) elements&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (Element&amp;lt;string&amp;gt; element in Element&amp;lt;string&amp;gt;.IterateListWithBackwardIndexing(words, 2))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.Append(element.Value);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (element.IsBackwardIndexed)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (element.BackwardIndex == 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Suffix for penultimate word&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return list.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;class Element&amp;lt;T&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private int backwardIndex;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Element(T value)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.Value = value;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.IsBackwardIndexed = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Element(T value, int backwardIndex)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.Value = value;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.IsBackwardIndexed = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.BackwardIndex = backwardIndex;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (this.BackwardIndex == 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.IsLast = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public T Value { get; private set; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public bool IsLast { get; private set; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public bool IsBackwardIndexed { get; private set; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public int BackwardIndex&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (this.IsBackwardIndexed)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return this.backwardIndex;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new InvalidOperationException(&amp;quot;The element is not backward indexed.&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private set { this.backwardIndex = value; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static IEnumerable&amp;lt;Element&amp;lt;T&amp;gt;&amp;gt; IterateListWithBackwardIndexing(IEnumerable&amp;lt;T&amp;gt; list, int elementsToIndex)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (elementsToIndex &amp;lt; 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new ArgumentOutOfRangeException(&amp;quot;elementsToIndex&amp;quot;, &amp;quot;The number of elements to index must be greater than zero.&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Queue&amp;lt;T&amp;gt; buffer = new Queue&amp;lt;T&amp;gt;(elementsToIndex);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (T item in list)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (buffer.Count == elementsToIndex)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Return unindexed elements as soon as the buffer is filled&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return new Element&amp;lt;T&amp;gt;(buffer.Dequeue());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;buffer.Enqueue(item);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (buffer.Count != 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Return the last elements with associated backward index&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return new Element&amp;lt;T&amp;gt;(buffer.Dequeue(), buffer.Count);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554025</link><pubDate>Fri, 17 Apr 2009 12:29:48 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554025</guid><dc:creator>Filini</dc:creator><description>&lt;p&gt;@SteveEisner: Yes, how fast the .Count() is performed is important, and the idea in my different tests was to only call it once (or never). But I didn't think that the .Count() could become a real bottleneck, I couldn't think of a real IEnumerator that performed supa-fast while iterating, but turtle-slow when calling the .Count().&lt;/p&gt;
&lt;p&gt;@Joren: there wasn't a real &amp;quot;purpose&amp;quot; in my tests to improve arbitrary programs, I was just curious on this: &amp;quot;I'll try a stupid cow-like approach to solve the problem, then I try to improve my algorithm, and see if optimization matters&amp;quot;. Then I thought: &amp;quot;are the algorithms posted by other people much faster than mine?&amp;quot; and I just made some tests. Finally, I saw how the length of the IEnumerable affects things, and I found it interesting, that's it :)&lt;/p&gt;
&lt;p&gt;@Todd: when I have some time, I'll test some other implementations posted here, with string.Join() and LINQ - even if I find it friggin' unreadable :P&lt;/p&gt;
&lt;p&gt;Overall, I just wanted to see how the Count() call and the IEnumerable length affect the different implementations. And I was really astonished how my semi-stupid approach performs quite fast for long enumerables.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554029</link><pubDate>Fri, 17 Apr 2009 12:34:52 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554029</guid><dc:creator>Iain B</dc:creator><description>&lt;p&gt;I decided on the single pass approach, prefixing with a comma except on the first item, and keeping track of the previous item to handle the final ' and '.&lt;/p&gt;
&lt;p&gt;I then refactored it, replacing conditionals with polymorphisms -- so no ifs, and no foreach.&lt;/p&gt;
&lt;p&gt;public string FormatStringList(IEnumerable&amp;lt;string&amp;gt; list)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp;var buffer = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;var itemWriter = list.Aggregate(new BaseItemWriter(), (writer, item) =&amp;gt; writer.Next(item, buffer));&lt;/p&gt;
&lt;p&gt; &amp;nbsp;itemWriter.FinishWriting(buffer);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;buffer.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;return buffer.ToString();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;public class BaseItemWriter&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public virtual BaseItemWriter Next(string item, StringBuilder resultBuffer)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;	return new FirstItemWriter(item, resultBuffer);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public virtual void FinishWriting(StringBuilder resultBuffer)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;public class FirstItemWriter : BaseItemWriter&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public FirstItemWriter(string item, StringBuilder resultBuffer)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;	resultBuffer.Append(item);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public override BaseItemWriter Next(string item, StringBuilder resultBuffer)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;	return new SubsequentItemsWriter(item, resultBuffer);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;public class SubsequentItemsWriter : BaseItemWriter&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp;private string _previous;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public SubsequentItemsWriter(string item, StringBuilder resultBuffer)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;	_previous = item;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public override BaseItemWriter Next(string item, StringBuilder resultBuffer)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;	_AppendPrevious(resultBuffer, &amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt;	_previous = item;&lt;/p&gt;
&lt;p&gt;	return this;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public override void FinishWriting(StringBuilder resultBuffer)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;	_AppendPrevious(resultBuffer, &amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt;	base.FinishWriting(resultBuffer);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;private void _AppendPrevious(StringBuilder resultBuffer, string separator)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;	resultBuffer.Append(separator);&lt;/p&gt;
&lt;p&gt;	resultBuffer.Append(_previous);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;public void Tests()&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp;Assert.AreEqual(&amp;quot;{}&amp;quot;, Foo(new string[0]));&lt;/p&gt;
&lt;p&gt; &amp;nbsp;Assert.AreEqual(&amp;quot;{ABC}&amp;quot;, Foo(new string[] {&amp;quot;ABC&amp;quot;}));&lt;/p&gt;
&lt;p&gt; &amp;nbsp;Assert.AreEqual(&amp;quot;{ABC and DEF}&amp;quot;, Foo(new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp;Assert.AreEqual(&amp;quot;{ABC, DEF, G and H}&amp;quot;, Foo(new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; }));&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554044</link><pubDate>Fri, 17 Apr 2009 12:51:50 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554044</guid><dc:creator>Nick Palladinos</dc:creator><description>&lt;p&gt;@ Jafar&lt;/p&gt;
&lt;p&gt;PowerPack is a supported library&lt;/p&gt;
&lt;p&gt;one of the supported libraries&lt;/p&gt;
&lt;p&gt;FSharp.Core.dll &lt;/p&gt;
&lt;p&gt;FSharp.PowerPack.dll &lt;/p&gt;
&lt;p&gt;FSharp.PowerPack.Linq.dll &lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_new" href="http://blogs.msdn.com/dsyme/archive/2008/08/29/the-f-september-2008-ctp-is-now-available.aspx"&gt;http://blogs.msdn.com/dsyme/archive/2008/08/29/the-f-september-2008-ctp-is-now-available.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I think the declarative nature of F# is a big win for this problem&lt;/p&gt;
&lt;p&gt;(The 4 pattern matching cases &amp;nbsp;reads just like the &amp;nbsp;the 4 characteristics of the specification)&lt;/p&gt;
&lt;p&gt;1) seq for IEnumerable&lt;/p&gt;
&lt;p&gt;2) LazyList for pattern matching&lt;/p&gt;
&lt;p&gt;3) avoid stack overflow with tailrecursion &lt;/p&gt;
&lt;p&gt;Declarative solution without performance penalty&lt;/p&gt;
&lt;p&gt;Happy FSharp hacking&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554051</link><pubDate>Fri, 17 Apr 2009 13:05:03 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554051</guid><dc:creator>Mark Rendle</dc:creator><description>&lt;p&gt;I left a performance test running overnight on three different methods.&lt;/p&gt;
&lt;p&gt;Method 1 calls ToArray then uses string.Join:&lt;/p&gt;
&lt;p&gt;public static string FormatListUsingArray(IEnumerable&amp;lt;string&amp;gt; source)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;var array = source.ToArray();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + ((array.Length == 0) ? string.Empty : (array.Length == 1) ? array[0] :&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string.Join(&amp;quot;, &amp;quot;, array, 0, array.Length - 1) + &amp;quot; and &amp;quot; + array[array.Length - 1]) + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Method 2 uses standard IEnumerable&amp;lt;T&amp;gt; methods and a Regex to change the last comma delimiter to &amp;quot; and &amp;quot;:&lt;/p&gt;
&lt;p&gt;public static string FormatListUsingLinq(IEnumerable&amp;lt;string&amp;gt; source)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;string last = string.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; +&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;source.DefaultIfEmpty()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Aggregate(new StringBuilder(),&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(acc, next) =&amp;gt; acc.AppendFormat(&amp;quot;, {0}&amp;quot;, last = next),&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acc =&amp;gt; Regex.Replace(acc.ToString().Substring(2), &amp;quot;, &amp;quot; + last + &amp;quot;$&amp;quot;, &amp;quot; and &amp;quot; + last))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+ &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Method 3 uses an extra IEnumerable&amp;lt;T&amp;gt; extension method to interpolate delimiters into the sequence:&lt;/p&gt;
&lt;p&gt;public static string FormatListUsingExtendedLinq(IEnumerable&amp;lt;string&amp;gt; source)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;source.AddDelimiters(&amp;quot;, &amp;quot;, &amp;quot; and &amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Aggregate(new StringBuilder(&amp;quot;{&amp;quot;), (acc, next) =&amp;gt; acc.Append(next)).Append(&amp;quot;}&amp;quot;).ToString();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;public static IEnumerable&amp;lt;T&amp;gt; AddDelimiters&amp;lt;T&amp;gt;(this IEnumerable&amp;lt;T&amp;gt; source, T delimiter, T lastDelimiter)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;T buffer = default(T);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;using (var enumerator = source.GetEnumerator())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (enumerator.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return enumerator.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (enumerator.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;buffer = enumerator.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (enumerator.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return delimiter;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return buffer;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;buffer = enumerator.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return lastDelimiter;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return buffer;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;OK. So I wrote a test application which ran each of these methods with sequences of 10^i elements &amp;nbsp;repeated 10^j times and left it to run a few times overnight. The method used to generate the elements was:&lt;/p&gt;
&lt;p&gt;private static IEnumerable&amp;lt;string&amp;gt; MakeTest(int count)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; count; i++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return i.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;I'm just going to include representative results from the 100 repetition cycles. The ratios for the higher reps were in line with these results. The numbers in brackets are the ratio against the Method 1 (Array).&lt;/p&gt;
&lt;p&gt;100 elements&lt;/p&gt;
&lt;p&gt;Method 1: &amp;nbsp;0.0032957 &amp;nbsp;(1.00)&lt;/p&gt;
&lt;p&gt;Method 2: &amp;nbsp;0.0078041 &amp;nbsp;(2.37)&lt;/p&gt;
&lt;p&gt;Method 3: &amp;nbsp;0.0090847 &amp;nbsp;(2.76)&lt;/p&gt;
&lt;p&gt;The array method is much quicker here, probably because it's not using much memory. I might have a look at the source for String.Join and see it there's some kind of shortcut being used for smaller sets. At this point, the extended LINQ method is actually the slowest.&lt;/p&gt;
&lt;p&gt;1000 elements&lt;/p&gt;
&lt;p&gt;Method 1: &amp;nbsp;0.0245377 &amp;nbsp;(1.00)&lt;/p&gt;
&lt;p&gt;Method 2: &amp;nbsp;0.0421903 &amp;nbsp;(1.72)&lt;/p&gt;
&lt;p&gt;Method 3: &amp;nbsp;0.0307378 &amp;nbsp;(1.25)&lt;/p&gt;
&lt;p&gt;The difference here is less marked, and the extended LINQ method has improved comparitively.&lt;/p&gt;
&lt;p&gt;10,000 elements&lt;/p&gt;
&lt;p&gt;Method 1: &amp;nbsp;0.3004786 &amp;nbsp;(1.00)&lt;/p&gt;
&lt;p&gt;Method 2: &amp;nbsp;0.4975804 &amp;nbsp;(1.66)&lt;/p&gt;
&lt;p&gt;Method 3: &amp;nbsp;0.3077020 &amp;nbsp;(1.02)&lt;/p&gt;
&lt;p&gt;100,000 elements&lt;/p&gt;
&lt;p&gt;Method 1: &amp;nbsp;3.4668577 &amp;nbsp;(1.00)&lt;/p&gt;
&lt;p&gt;Method 2: &amp;nbsp;5.2642692 &amp;nbsp;(1.52)&lt;/p&gt;
&lt;p&gt;Method 3: &amp;nbsp;3.6730131 &amp;nbsp;(1.06)&lt;/p&gt;
&lt;p&gt;With both the larger sets, the extended LINQ method and the array method take about the same amount of time, with the standard LINQ method running ~50-60% longer.&lt;/p&gt;
&lt;p&gt;The tests were run on a Windows XP SP3 32-bit dual-core desktop with 4Gb of RAM. If this were more significant, and not just an irrationally obsessive response to a post on Eric's blog, I'd like to run them on a low-memory PC to see if the array method suffers at the higher set sizes.&lt;/p&gt;
&lt;p&gt;Anyway, I hope people found that interesting.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554125</link><pubDate>Fri, 17 Apr 2009 14:29:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554125</guid><dc:creator>Jagannath</dc:creator><description>&lt;p&gt;Please find a small change in my code where I am using string array instead of IEnumerable in the Join function. This performs much better.&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Diagnostics;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Collections;&lt;/p&gt;
&lt;p&gt;using System.Linq;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;namespace SampleApp&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;static class Program&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IEnumerable&amp;lt;string&amp;gt; elems = BuildStringArray();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.Diagnostics.Stopwatch sw = new Stopwatch();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sw.Start();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Console.WriteLine(elems.Join(&amp;quot;,&amp;quot;, &amp;quot; and &amp;quot;));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//elems.Join(&amp;quot;,&amp;quot;, &amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Join(elems.ToArray&amp;lt;string&amp;gt;(), &amp;quot;,&amp;quot;, &amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TimeSpan ts = sw.Elapsed;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Console.WriteLine(&amp;quot;{0}:{1}:{2}:{3}&amp;quot;, ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(ts.TotalSeconds);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static IEnumerable&amp;lt;string&amp;gt; BuildStringArray()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string alphabets = &amp;quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &amp;nbsp;string[] elements = new string[100];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Random random = new Random(40);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; 100000; i++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int min = random.Next(10, 25);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int max = random.Next(min, 25);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return alphabets.Substring(min, max - min + 1);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string Join(string[] source, &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string delimeter1, &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string delimeter2)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int NumElem = source.Count();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder finalString = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; NumElem -1; i++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;finalString.Append(string.Format(&amp;quot;{0}{1}&amp;quot;, source[i],&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(i + 1 &amp;lt; NumElem -1 ) ? delimeter1 : delimeter2));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (NumElem &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;finalString.Append(source[NumElem - 1]); &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;finalString.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return finalString.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554182</link><pubDate>Fri, 17 Apr 2009 15:43:08 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554182</guid><dc:creator>rbirkby</dc:creator><description>&lt;p&gt;@Mark Rendle: At one stage I had an AddDelimiters() method like yours - I liked the idea of inserting the delimiters into the sequence stream. However it eventually morphed into the Cons class I posted.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554283</link><pubDate>Fri, 17 Apr 2009 17:20:29 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554283</guid><dc:creator>mokeefe</dc:creator><description>&lt;p&gt;Now I'm home and fed, I can do it the way I wanted originally - with the built in Queue&amp;lt;string&amp;gt;. Honestly, I started this way with my earlier post, but stepped back and coded a buffer explicitly - I shouldn't have bothered. &lt;/p&gt;
&lt;p&gt;This will work with a TB source (providing it's streamed via a file or IDataReader).&lt;/p&gt;
&lt;p&gt;Full Console &amp;nbsp;Program.&lt;/p&gt;
&lt;p&gt;class Program&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;string&amp;gt; source = new List&amp;lt;string&amp;gt;(new String[] { &amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot; });&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// How to use a StringBuilder - &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder stringBuilder = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringWriter writer = new StringWriter(stringBuilder);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;WriteOutput(source, writer);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(&amp;quot;StringBuilder output.&amp;quot;); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(stringBuilder.ToString());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(&amp;quot;--------------------&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Do some heavy lifting &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Creating a dummy IEnurable source - could be a ten GB file, db reader etc.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(&amp;quot;Do some heavier lifting - Streamed output.&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(&amp;quot;Press any key to continue.&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.ReadLine();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;source.Clear(); // Empty and repopulate source&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int maxItems = 100; // Try 0 and 1 and 100000.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; maxItems; i++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;source.Add(i.ToString());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Stream&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;WriteOutput(source, Console.Out);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.ReadLine();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/// &amp;lt;param name=&amp;quot;writer&amp;quot;&amp;gt;TextWriter param supports streaming output&amp;lt;/param&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void WriteOutput(IEnumerable&amp;lt;string&amp;gt; items, TextWriter writer)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Queue&amp;lt;string&amp;gt; buffer = new Queue&amp;lt;string&amp;gt;(3);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;writer.Write(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string item in items)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;buffer.Enqueue(item);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (buffer.Count == 3)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;writer.Write(String.Format(&amp;quot;{0}, &amp;quot;, buffer.Dequeue()));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;writer.Flush();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Slow down for user viewing&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Drop this.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.Threading.Thread.Sleep(50);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (buffer.Count == 1) // I have one to output&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;writer.Write(buffer.Dequeue());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if (buffer.Count == 2) // I have two to output&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;writer.Write(&amp;quot;{0} and {1}&amp;quot;, buffer.Dequeue(), buffer.Dequeue());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if (buffer.Count == 3)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;writer.Write(&amp;quot;{0}, {1} and {2}&amp;quot;, buffer.Dequeue(), buffer.Dequeue(), buffer.Dequeue());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;writer.Write(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;PS: I Think I'm about to come up as mokeefe (Martin O'Keefe).&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554296</link><pubDate>Fri, 17 Apr 2009 17:36:50 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554296</guid><dc:creator>Fabio Galuppo</dc:creator><description>&lt;p&gt;Simple and Fast (I guess):&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Linq;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;namespace CSharpTest&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;static class Solution&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static StringBuilder Append(this StringBuilder sb, string one, string two) { return sb.Append(one).Append(two); }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string Next(this IEnumerator&amp;lt;string&amp;gt; enumerator) { enumerator.MoveNext(); return enumerator.Current; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string GetSequence(IEnumerable&amp;lt;string&amp;gt; items)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;const string OPEN = &amp;quot;{&amp;quot;, CLOSE = &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//(1) If the sequence is empty then the resulting string is &amp;quot;{}&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (null == items) &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return OPEN + CLOSE;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int itemsCount = items.Count();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch (itemsCount)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//(1) If the sequence is empty then the resulting string is &amp;quot;{}&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 0:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return OPEN + CLOSE;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//(2) If the sequence is a single item &amp;quot;ABC&amp;quot; then the resulting string is &amp;quot;{ABC}&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 1:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return OPEN + items.First() + CLOSE;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//(3) If the sequence is the two item sequence &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; then the resulting string is &amp;quot;{ABC and DEF}&amp;quot;.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//(4) If the sequence has more than two items, say, &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; then the resulting string is &amp;quot;{ABC, DEF, G and H}&amp;quot;. (Note: no Oxford comma!)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;const int COUNTDOWN = 2, ESTIMATED_STRING_LENGTH = 4;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;const string SEPARATOR = &amp;quot;,&amp;quot;, SEPARATOR_END = &amp;quot;and&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var sb = new StringBuilder(OPEN, ESTIMATED_STRING_LENGTH * itemsCount);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var enumerator = items.GetEnumerator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (COUNTDOWN &amp;lt; itemsCount--) &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(enumerator.Next(), SEPARATOR)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Append(&amp;quot; &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.Append(enumerator.Next(), &amp;quot; &amp;quot;).Append(SEPARATOR_END, &amp;quot; &amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .Append(enumerator.Next(), CLOSE)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;class Program&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Action&amp;lt;string&amp;gt; print = Console.WriteLine;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;print( Solution.GetSequence(new string[] { &amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;D&amp;quot; }) );&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;print( Solution.GetSequence(new string[] { &amp;quot;A&amp;quot;, &amp;quot;B&amp;quot; }) );&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;print( Solution.GetSequence(new string[] { &amp;quot;A&amp;quot; }) );&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;print( Solution.GetSequence(new string[] {}) );&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;print( Solution.GetSequence(null) ); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554297</link><pubDate>Fri, 17 Apr 2009 17:37:09 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554297</guid><dc:creator>Aaron G</dc:creator><description>&lt;p&gt;Just thought of another consideration: &amp;nbsp;It's entirely possible that the input IEnumerable&amp;lt;string&amp;gt; can only be enumerated once, i.e. if it's from a Linq to SQL query. &amp;nbsp;In this case, calling the Count(), First(), or Last() method before building the string will actually cause an exception to be thrown on the full pass.&lt;/p&gt;
&lt;p&gt;This is why I loathe unit testing - you can take the simplest code in the world, write twice as much testing code as implementation code, and still not cover the most elementary of failure conditions.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554323</link><pubDate>Fri, 17 Apr 2009 18:05:11 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554323</guid><dc:creator>Steve Wagner</dc:creator><description>&lt;p&gt;@Aaron G - my team are heavy users -- and lovers -- of TDD. In the case you mention we would add another test that calls out this problem and then fix the code such that the new test passes while retaining the coverage offfered by the original tests.&lt;/p&gt;
&lt;p&gt;Noone expects that we can capture every possible problem that can arise, but as they are encountered they are handled in this manner.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554331</link><pubDate>Fri, 17 Apr 2009 18:13:59 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554331</guid><dc:creator>ErikF</dc:creator><description>&lt;p&gt;Mine is similiar to many of these: it's a single-pass with one flag.&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;public class CommaSplicer {&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public static void Main(string[] args) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Random rand = new Random();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int numArrays = rand.Next(20);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;List&amp;lt;List&amp;lt;string&amp;gt;&amp;gt; l = new List&amp;lt;List&amp;lt;string&amp;gt;&amp;gt;(numArrays);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;for(int i = 0; i &amp;lt; numArrays; ++i) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;string&amp;gt; li = new List&amp;lt;string&amp;gt;(i);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(int j = 0; j &amp;lt; i; ++j) li.Add(String.Intern(j.ToString()));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.Add(li);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;List&amp;lt;string&amp;gt; resultList = new List&amp;lt;string&amp;gt;(numArrays); &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;sw.Start();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;foreach(List&amp;lt;string&amp;gt; ls in l) resultList.Add(CommaJoin(ls));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;sw.Stop();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;TimeSpan ts = sw.Elapsed;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;foreach(string s in resultList) Console.WriteLine(s);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Console.WriteLine(&amp;quot;Time to join {0} sets of strings: {1}&amp;quot;,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;numArrays.ToString(),&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;ts.ToString());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public static string CommaJoin(IEnumerable&amp;lt;string&amp;gt; s) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;StringBuilder temp = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;IEnumerator&amp;lt;string&amp;gt; slist = s.GetEnumerator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;string a;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;bool firstComma = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;temp.Append('{');&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if(slist.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;// At least one item exists in the list&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(a = slist.Current; ; a = slist.Current) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(slist.MoveNext()) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// At least one more item exists in the list&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!firstComma)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// First element of the list&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;firstComma = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;temp.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;temp.Append(a);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// No more items exist in the list&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(firstComma)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Last element of the list&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;temp.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;temp.Append(a);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;temp.Append('}');&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return temp.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554351</link><pubDate>Fri, 17 Apr 2009 18:32:35 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554351</guid><dc:creator>Bill Wert</dc:creator><description>&lt;p&gt;Who needs state flags or re-parsing of the string? The good solutions are all taken, so I went for unique..&lt;/p&gt;
&lt;p&gt; &amp;nbsp;static string ParseFun(IEnumerable&amp;lt;string&amp;gt; input)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!input.Any())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IEnumerable&amp;lt;string&amp;gt; s = input.Reverse().Select(x =&amp;gt; x.Reverse());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Action&amp;lt;string&amp;gt; meth = str =&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(str);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;meth = str1 =&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot; dna &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(str1);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;meth = str2 =&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot; ,&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(str2);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (var item in s)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;meth(item);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.ToString().Reverse();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;// boring string reverse extension method omitted.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554370</link><pubDate>Fri, 17 Apr 2009 19:02:13 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554370</guid><dc:creator>ptoniolo</dc:creator><description>&lt;p&gt;As I already noticed before, the flaw of my solution was in the use of sb.AppendFormat, definitely costly in terms of running time. Avoiding the unnecessary Format part, I am quite sure that all the other solutions require more time, and even much more memory. Testing it informally, 10 million calls with an array of 9 1-character strings, I get the result in less than 6 seconds, whereas the better solutions with lists/arrays can be around 8 seconds, with double memory requirements, maybe even more!&lt;/p&gt;
&lt;p&gt;Well, I know that space/time issues were not in the original requirements, but I also know that the original requirements were to use only the Enumerable methods, and most of the solutions are in fact using much more than that: mostly the extensions coming form Linq. That means to me not conceptually to-the-point: not portable to fw pre-3.5, to other languages/realms using the enumerable metaphors and so on!&lt;/p&gt;
&lt;p&gt;string Stringize(IEnumerable&amp;lt;string&amp;gt; list) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp;var sb = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;var e = list.GetEnumerator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp;if(e.MoveNext()) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;sb.Append(e.Current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if(e.MoveNext()) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;var current = e.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;while(e.MoveNext()) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;, &amp;quot;).Append(current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;current = e.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot; and &amp;quot;).Append(current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;return sb.Append(&amp;quot;}&amp;quot;).ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554372</link><pubDate>Fri, 17 Apr 2009 19:05:25 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554372</guid><dc:creator>Danny</dc:creator><description>&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(Quibble(new List&amp;lt;String&amp;gt; {&amp;quot;one&amp;quot;}));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(Quibble(new List&amp;lt;String&amp;gt; {&amp;quot;one&amp;quot;, &amp;quot;two&amp;quot;}));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(Quibble(new List&amp;lt;String&amp;gt; {&amp;quot;one&amp;quot;, &amp;quot;two&amp;quot;, &amp;quot;three&amp;quot;}));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(Quibble(new List&amp;lt;String&amp;gt; {&amp;quot;one&amp;quot;, &amp;quot;two&amp;quot;, &amp;quot;three&amp;quot;, &amp;quot;four&amp;quot;}));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static String Quibble(IEnumerable&amp;lt;string&amp;gt; pStrings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (pStrings.Count() == 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return String.Format(&amp;quot;{0}{1}{2}&amp;quot;, &amp;quot;{&amp;quot;, pStrings.ElementAt(0), &amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (pStrings.Count() == 2)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return String.Format(&amp;quot;{0}{1}{2}{3}{4}&amp;quot;, &amp;quot;{&amp;quot;, pStrings.ElementAt(0), &amp;quot; and &amp;quot;, pStrings.ElementAt(1), &amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return QuibbleOverTwo(pStrings);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static String QuibbleOverTwo(IEnumerable&amp;lt;string&amp;gt; pStrings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var aBuilder = new StringBuilder().Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var aStartIndexOfLastStr = -(pStrings.Last().Length + 1);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach(var aString in pStrings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aBuilder.Append(aString).Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aStartIndexOfLastStr += aString.Length + 2;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aBuilder.Remove(aStartIndexOfLastStr - 2, 1).Insert(aStartIndexOfLastStr - 1, &amp;quot;and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return aBuilder.Remove(aBuilder.Length - 2, 2).Append(&amp;quot;}&amp;quot;).ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554379</link><pubDate>Fri, 17 Apr 2009 19:14:03 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554379</guid><dc:creator>ptoniolo</dc:creator><description>&lt;p&gt;ErikF, I like your solution: no backtracking, single pass on input and output, both used as streams. You even stick to the methods of Enumerable but... why all these ifs in the inner loop?&lt;/p&gt;
&lt;p&gt;You have an if to check for a condition that can happen only on the first item, another one for a condition that can happen only on the last. If the strings enumerated are many, this will cost you a lot.&lt;/p&gt;
&lt;p&gt;And I do not like that break to exit from the loop. I'm not Dijkstra, but I believe that algs using few masked-gotos are much more readable and testable and... you know!&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554384</link><pubDate>Fri, 17 Apr 2009 19:24:27 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554384</guid><dc:creator>Rick Dailey</dc:creator><description>&lt;p&gt;@Filini Thanks for the feedback. &amp;nbsp;For some reason, I figured Length was automatically kept up to date as items were added (not calculated) and would be simpler (one less variable, keeping the code terse) without adding a performance hit.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554448</link><pubDate>Fri, 17 Apr 2009 20:40:12 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554448</guid><dc:creator>[ICR]</dc:creator><description>&lt;p&gt;In the spirit of violating YAGNI and over engineering that these sort of problems provide here is one that only requires going through the sequence once. It annotates the items with their index and whether it is the first, last or penultimate item and yields them as another IEnumerable.&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;public class CommaQuibble&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static void Main()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;	List&amp;lt;string&amp;gt; list = new List&amp;lt;string&amp;gt;() { };&lt;/p&gt;
&lt;p&gt;	Console.WriteLine(ToList(list));&lt;/p&gt;
&lt;p&gt;	for(int i = 0; i &amp;lt;= 4; i += 1)&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;list.Add(i.ToString());&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;Console.WriteLine(ToList(list));&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static string ToList(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;	StringBuilder stringBuilder = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt;	foreach(SequenceInfo&amp;lt;string&amp;gt; s in SequenceInfo&amp;lt;string&amp;gt;.GetSequenceInfo(strings))&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;stringBuilder.Append(s.Value);&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;if (s.IsPenultimate)&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;		stringBuilder.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;else if (!s.IsLast)&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;		stringBuilder.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;	stringBuilder.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt;	return stringBuilder.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;public class SequenceInfo&amp;lt;T&amp;gt;&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private T _value;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public T Value { get { return _value; } }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private int index;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public int Index { get { return index; } }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public bool IsFirst { get { return (index == 0); } }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private bool isLast;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public bool IsLast { get { return isLast; } }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;private bool isPenultimate;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public bool IsPenultimate { get { return isPenultimate; } }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public SequenceInfo(T value, int index, bool isPenultimate, bool isLast)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;	this._value = value;&lt;/p&gt;
&lt;p&gt;	this.index = index;&lt;/p&gt;
&lt;p&gt;	this.isLast = isLast;&lt;/p&gt;
&lt;p&gt;	this.isPenultimate = isPenultimate;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static IEnumerable&amp;lt;SequenceInfo&amp;lt;T&amp;gt;&amp;gt; GetSequenceInfo(IEnumerable&amp;lt;T&amp;gt; sequence)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;	T current, next, nextnext;&lt;/p&gt;
&lt;p&gt;	int index = 0;&lt;/p&gt;
&lt;p&gt;	IEnumerator&amp;lt;T&amp;gt; enumerator = sequence.GetEnumerator();&lt;/p&gt;
&lt;p&gt;	if (enumerator.MoveNext())&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;current = enumerator.Current;&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;	else&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;yield break;&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;	if (enumerator.MoveNext())&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;next = enumerator.Current;&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;	else&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;yield return new SequenceInfo&amp;lt;T&amp;gt;(current, index, false, true);&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;yield break;&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;	if (enumerator.MoveNext())&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;nextnext = enumerator.Current;&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;	else&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;yield return new SequenceInfo&amp;lt;T&amp;gt;(current, index, true, false);&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;yield return new SequenceInfo&amp;lt;T&amp;gt;(next, index + 1, false, true);&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;yield break;&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;	while (true)&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;yield return new SequenceInfo&amp;lt;T&amp;gt;(current, index, false, false);&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;current = next;&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;next = nextnext;&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;index += 1;&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;if (enumerator.MoveNext())&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;		nextnext = enumerator.Current;&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;		yield return new SequenceInfo&amp;lt;T&amp;gt;(current, index, true, false);&lt;/p&gt;
&lt;p&gt;		yield return new SequenceInfo&amp;lt;T&amp;gt;(next, index + 1, false, true);&lt;/p&gt;
&lt;p&gt;		yield break;&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;@Aaron G: I don't think the goal should be to minimise the number of assignments or checks inside the loop. If it could be run on a large number of items I would argue the goal is to reduce the algorithmic complexity whilst still maintaining clarity (in this case only enumerating the sequence once or twice). Only if it still proves to be a performance bottleneck would you start to reduce assignments and checks. Obviously that's not a liscence to go mad :)&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554503</link><pubDate>Fri, 17 Apr 2009 21:44:54 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554503</guid><dc:creator>Andrey Titov [izobr]</dc:creator><description>&lt;p&gt;And of couse the more serious reason than perfomance problems for not to use Count() or iterate twice, without populating whole sequence to list is instability of source:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static IEnumerable&amp;lt;string&amp;gt; GetSomeStrings()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var rnd = new Random(DateTime.Now.Ticks.GetHashCode());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var count = rnd.Next(10);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (var i = 0; i &amp;lt; count; i++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return rnd.Next().ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554518</link><pubDate>Fri, 17 Apr 2009 22:06:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554518</guid><dc:creator>Chris</dc:creator><description>&lt;p&gt;1. There were very few F# programs&lt;/p&gt;
&lt;p&gt;2. I saw 1 F# program almost identical to this, but it had a bug (didn't handle 3 elements)&lt;/p&gt;
&lt;p&gt;3. Imperative programs are far too long and unreadable for this problem&lt;/p&gt;
&lt;p&gt;let answerToQuestion (items: IEnumerable&amp;lt;string&amp;gt;) = &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;let rec joiner (items: IEnumerable&amp;lt;string&amp;gt;) = &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;match Seq.to_list (items.Cast()) with&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| f :: s :: [] -&amp;gt; f + &amp;quot; and &amp;quot; + s&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| f :: [] -&amp;gt; f&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| f :: tl -&amp;gt; f + &amp;quot;, &amp;quot; + joiner tl&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| [] | _ -&amp;gt; &amp;quot;&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;&amp;quot;{&amp;quot; + (joiner items) + &amp;quot;}&amp;quot; &lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554524</link><pubDate>Fri, 17 Apr 2009 22:14:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554524</guid><dc:creator>Wil Peck</dc:creator><description>&lt;p&gt;I reviewed my solution with one of my friends who works at Microsoft. &amp;nbsp;He said my solution was fine, but the only thing he asked is, what is the cost of the algorithm. &amp;nbsp;I hate to admit it, but at that point I was really focusing on code clarity and performance was not on my mind. &amp;nbsp;Using the .Count() method makes it so that I have to iterate over the collection of items more than once. &amp;nbsp;For small sets of data this is probably trivial, but as the data sets increase the performance of my algorithm decreases.&lt;/p&gt;
&lt;p&gt;This is why the scan forward methods are preferrable. So, although IMO the code I wrote may be a little easier to maintain - it is twice as slow. :| &amp;nbsp;&lt;/p&gt;
&lt;p&gt;Lesson learned.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554541</link><pubDate>Fri, 17 Apr 2009 22:34:42 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554541</guid><dc:creator>Jon Skeet</dc:creator><description>&lt;p&gt;@ICR: I considered using exactly the same approach - I have a similar &amp;quot;SmartEnumerable&amp;quot; class in my MiscUtil library (&lt;a rel="nofollow" target="_new" href="http://pobox.com/~skeet/csharp/miscutil"&gt;http://pobox.com/~skeet/csharp/miscutil&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Note that in production code you should use a &amp;quot;using&amp;quot; statement for the IEnumerator&amp;lt;T&amp;gt; - that can be very important for sequences which use resources. My implementation is somewhat shorter though - please let me know if I've missed anything subtle! (I added the index part after first/last, which is why I've got a separate Boolean for it. I like your use of just the index.)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public IEnumerator&amp;lt;Entry&amp;gt; GetEnumerator()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;using (IEnumerator&amp;lt;T&amp;gt; enumerator = enumerable.GetEnumerator())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!enumerator.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield break;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bool isFirst = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bool isLast = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int index=0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (!isLast)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;T current = enumerator.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;isLast = !enumerator.MoveNext();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return new Entry(isFirst, isLast, current, index++);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;isFirst = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554545</link><pubDate>Fri, 17 Apr 2009 22:35:55 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554545</guid><dc:creator>Jon Skeet</dc:creator><description>&lt;p&gt;@ICR: Doh! I've just noticed one reason yours is more complicated - it has &amp;quot;IsPenultimate&amp;quot; as well as &amp;quot;IsLast&amp;quot;. I suspect I could add that without *quite* as much code, but it's definitely additional complexity to consider.&lt;/p&gt;
&lt;p&gt;Jon&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554554</link><pubDate>Fri, 17 Apr 2009 22:44:50 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554554</guid><dc:creator>kevotheclone</dc:creator><description>&lt;p&gt;Take a look at Perl's Lingua::Conjunction module. &amp;nbsp;It basically does what Eric's asked, plus it support a &amp;quot;phrase separator&amp;quot; in cases where the &amp;quot;word separator&amp;quot; (a comma in our case) already appears in any list element.&lt;/p&gt;
&lt;p&gt;So ['Jack, a boy', 'Jill, a girl', 'Spot, a dog'] becomes &amp;quot;Jack, a boy; Jill, a girl; and Spot, a dog&amp;quot;.&lt;/p&gt;
&lt;p&gt;There's also a &amp;quot;penultimate&amp;quot; subroutine that performs the same function, except it excludes the final punctuation before the conjunction word.&lt;/p&gt;
&lt;p&gt;And of course this module allows you to pass in the word separator, phrase separator and the conjunction. &amp;nbsp;All waaaaay out of scope for Eric's example, but it's something to consider if you're going to write/use this type of code in a production environment.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_new" href="http://search.cpan.org/dist/Lingua-Conjunction/Conjunction.pm"&gt;http://search.cpan.org/dist/Lingua-Conjunction/Conjunction.pm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I recently wrote a JScript and a Python version of Lingua::Conjunction but I don't have the source code with me at the moment. :-(&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554588</link><pubDate>Fri, 17 Apr 2009 23:23:32 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554588</guid><dc:creator>Fabio Galuppo</dc:creator><description>&lt;p&gt;NO C++ solution, yet... I need to fix this ;-)&lt;/p&gt;
&lt;p&gt;#include &amp;lt;algorithm&amp;gt;&lt;/p&gt;
&lt;p&gt;#include &amp;lt;string&amp;gt;&lt;/p&gt;
&lt;p&gt;#include &amp;lt;sstream&amp;gt;&lt;/p&gt;
&lt;p&gt;#include &amp;lt;iostream&amp;gt;&lt;/p&gt;
&lt;p&gt;#include &amp;lt;vector&amp;gt;&lt;/p&gt;
&lt;p&gt;#include &amp;lt;iterator&amp;gt;&lt;/p&gt;
&lt;p&gt;using namespace std;&lt;/p&gt;
&lt;p&gt;namespace Solution&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;template&amp;lt; class Elem, class TString = basic_string&amp;lt;Elem&amp;gt;, class TSequenceContainter = vector&amp;lt;TString&amp;gt; &amp;gt;&lt;/p&gt;
&lt;p&gt;class GetSequence&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;	TString Open_, Close_, Separator_, Separator_End_;			&lt;/p&gt;
&lt;p&gt;	int min( int lVal, int rVal ){ return lVal &amp;lt; rVal ? lVal : rVal; }&lt;/p&gt;
&lt;p&gt;public:&lt;/p&gt;
&lt;p&gt;	GetSequence(TString open, TString close, TString separator, TString separator_end) :&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp;Open_(open), Close_(close), Separator_(separator), Separator_End_(separator_end){}&lt;/p&gt;
&lt;p&gt;	TString get(const TSequenceContainter&amp;amp; items)&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;		TSequenceContainter::size_type itemsCount = items.size();&lt;/p&gt;
&lt;p&gt;		typedef &amp;nbsp;ostream_iterator&amp;lt;TString, Elem&amp;gt; iter;&lt;/p&gt;
&lt;p&gt;		basic_stringstream&amp;lt;Elem&amp;gt; ss;&lt;/p&gt;
&lt;p&gt;		ss &amp;lt;&amp;lt; Open_;&lt;/p&gt;
&lt;p&gt;		copy( items.begin(), items.end() - min(2, itemsCount), iter( ss, Separator_.c_str() ) );&lt;/p&gt;
&lt;p&gt;		copy( items.end() - min(2, itemsCount), items.end() - min(1, itemsCount), iter( ss, Separator_End_.c_str() ) );&lt;/p&gt;
&lt;p&gt;		copy( items.end() - min(1, itemsCount), items.end(), iter( ss ) );&lt;/p&gt;
&lt;p&gt;		ss &amp;lt;&amp;lt; Close_;&lt;/p&gt;
&lt;p&gt;		return ss.str();&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;};&lt;/p&gt;
&lt;p&gt;GetSequence&amp;lt;char&amp;gt; seq_ASCII(){ return GetSequence&amp;lt;char&amp;gt;(&amp;quot;{&amp;quot;, &amp;quot;}&amp;quot;, &amp;quot;, &amp;quot;, &amp;quot; and &amp;quot;); }&lt;/p&gt;
&lt;p&gt;GetSequence&amp;lt;wchar_t&amp;gt; seq_Unicode(){ return GetSequence&amp;lt;wchar_t&amp;gt;(L&amp;quot;{&amp;quot;, L&amp;quot;}&amp;quot;, L&amp;quot;, &amp;quot;, L&amp;quot; and &amp;quot;); }&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;int main()&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;	vector&amp;lt;string&amp;gt; x;&lt;/p&gt;
&lt;p&gt;	x.push_back(&amp;quot;A&amp;quot;);&lt;/p&gt;
&lt;p&gt;	x.push_back(&amp;quot;B&amp;quot;);&lt;/p&gt;
&lt;p&gt;	x.push_back(&amp;quot;C&amp;quot;);&lt;/p&gt;
&lt;p&gt;	x.push_back(&amp;quot;D&amp;quot;);&lt;/p&gt;
&lt;p&gt;	cout &amp;lt;&amp;lt; Solution::seq_ASCII().get( x ) &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;/p&gt;
&lt;p&gt;	vector&amp;lt;string&amp;gt; y;&lt;/p&gt;
&lt;p&gt;	y.push_back(&amp;quot;A&amp;quot;);&lt;/p&gt;
&lt;p&gt;	y.push_back(&amp;quot;B&amp;quot;);&lt;/p&gt;
&lt;p&gt;	cout &amp;lt;&amp;lt; Solution::seq_ASCII().get( y ) &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;/p&gt;
&lt;p&gt;	vector&amp;lt;string&amp;gt; z;&lt;/p&gt;
&lt;p&gt;	z.push_back(&amp;quot;A&amp;quot;);&lt;/p&gt;
&lt;p&gt;	cout &amp;lt;&amp;lt; Solution::seq_ASCII().get( z ) &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;/p&gt;
&lt;p&gt;	vector&amp;lt;string&amp;gt; w;&lt;/p&gt;
&lt;p&gt;	cout &amp;lt;&amp;lt; Solution::seq_ASCII().get( w ) &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;/p&gt;
&lt;p&gt;	vector&amp;lt;wstring&amp;gt; ux;&lt;/p&gt;
&lt;p&gt;	ux.push_back(L&amp;quot;A&amp;quot;);&lt;/p&gt;
&lt;p&gt;	ux.push_back(L&amp;quot;B&amp;quot;);&lt;/p&gt;
&lt;p&gt;	ux.push_back(L&amp;quot;C&amp;quot;);&lt;/p&gt;
&lt;p&gt;	ux.push_back(L&amp;quot;D&amp;quot;);&lt;/p&gt;
&lt;p&gt;	wcout &amp;lt;&amp;lt; Solution::seq_Unicode().get( ux ) &amp;lt;&amp;lt; L&amp;quot;\n&amp;quot;;&lt;/p&gt;
&lt;p&gt;	vector&amp;lt;wstring&amp;gt; uy;&lt;/p&gt;
&lt;p&gt;	uy.push_back(L&amp;quot;A&amp;quot;);&lt;/p&gt;
&lt;p&gt;	uy.push_back(L&amp;quot;B&amp;quot;);&lt;/p&gt;
&lt;p&gt;	wcout &amp;lt;&amp;lt; Solution::seq_Unicode().get( uy ) &amp;lt;&amp;lt; L&amp;quot;\n&amp;quot;;&lt;/p&gt;
&lt;p&gt;	vector&amp;lt;wstring&amp;gt; uz;&lt;/p&gt;
&lt;p&gt;	uz.push_back(L&amp;quot;A&amp;quot;);&lt;/p&gt;
&lt;p&gt;	wcout &amp;lt;&amp;lt; Solution::seq_Unicode().get( uz ) &amp;lt;&amp;lt; L&amp;quot;\n&amp;quot;;&lt;/p&gt;
&lt;p&gt;	vector&amp;lt;wstring&amp;gt; uw;&lt;/p&gt;
&lt;p&gt;	wcout &amp;lt;&amp;lt; Solution::seq_Unicode().get( uw ) &amp;lt;&amp;lt; L&amp;quot;\n&amp;quot;;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554613</link><pubDate>Fri, 17 Apr 2009 23:50:25 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554613</guid><dc:creator>Abhijeet Patel</dc:creator><description>&lt;p&gt;@Jagannath&lt;/p&gt;
&lt;p&gt;The input in the file would look as follows:&lt;/p&gt;
&lt;p&gt;abc&lt;/p&gt;
&lt;p&gt;bca&lt;/p&gt;
&lt;p&gt;,&lt;/p&gt;
&lt;p&gt;cab&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;bca&lt;/p&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;p&gt;{abc,bca and cab} &lt;/p&gt;
&lt;p&gt;At least that is my &amp;quot;interpretation&amp;quot; of the problem:&lt;/p&gt;
&lt;p&gt;@Eric: Is this right?&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554659</link><pubDate>Sat, 18 Apr 2009 00:35:51 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554659</guid><dc:creator>ErikF</dc:creator><description>&lt;p&gt;If you call XSLT a language, here's the solution in that:&lt;/p&gt;
&lt;p&gt;(test.xml)&lt;/p&gt;
&lt;p&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;?xml-stylesheet type=&amp;quot;text/xsl&amp;quot; href=&amp;quot;test.xsl&amp;quot;?&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;root&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;&amp;lt;names&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;name&amp;gt;Joe&amp;lt;/name&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;name&amp;gt;John&amp;lt;/name&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;&amp;lt;/names&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;&amp;lt;names&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;name&amp;gt;Alice&amp;lt;/name&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;&amp;lt;/names&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;&amp;lt;names/&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;&amp;lt;names&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;name&amp;gt;Bill&amp;lt;/name&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;name&amp;gt;Betty&amp;lt;/name&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;name&amp;gt;Bob&amp;lt;/name&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;&amp;lt;/names&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/root&amp;gt;&lt;/p&gt;
&lt;p&gt;(test.xsl)&lt;/p&gt;
&lt;p&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;xsl:stylesheet xmlns:xsl=&amp;quot;&lt;a rel="nofollow" target="_new" href="http://www.w3.org/1999/XSL/Transform&amp;quot;"&gt;http://www.w3.org/1999/XSL/Transform&amp;quot;&lt;/a&gt; version=&amp;quot;1.1&amp;quot;&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:output method=&amp;quot;text&amp;quot;/&amp;gt;&lt;/p&gt;
&lt;p&gt;	&amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;		&amp;lt;xsl:apply-templates/&amp;gt;&lt;/p&gt;
&lt;p&gt;	&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:template match=&amp;quot;names&amp;quot;&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Original: {&amp;lt;xsl:apply-templates select=&amp;quot;name&amp;quot;/&amp;gt;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Delimited: &amp;lt;xsl:call-template name=&amp;quot;do-commas&amp;quot;&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:with-param name=&amp;quot;values&amp;quot; select=&amp;quot;name&amp;quot;/&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/xsl:call-template&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:template name=&amp;quot;do-commas&amp;quot;&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:param name=&amp;quot;values&amp;quot;/&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:text&amp;gt;{&amp;lt;/xsl:text&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:for-each select=&amp;quot;$values&amp;quot;&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:choose&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:when test=&amp;quot;count($values)&amp;amp;gt;1 and position()=count($values)&amp;quot;&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:text&amp;gt; and &amp;lt;/xsl:text&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/xsl:when&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:when test=&amp;quot;position()&amp;amp;gt;1&amp;quot;&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:text&amp;gt;, &amp;lt;/xsl:text&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/xsl:when&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/xsl:choose&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:value-of select=&amp;quot;.&amp;quot;/&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/xsl:for-each&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;xsl:text&amp;gt;}&amp;lt;/xsl:text&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554710</link><pubDate>Sat, 18 Apr 2009 01:47:42 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554710</guid><dc:creator>Sandeep</dc:creator><description>&lt;p&gt;This is just my brain dump -- a quick attempt -- with scant regard to refining it (which I'm sure is possible in truckloads :-)). I just felt that a few extra operations would not be too expensive when compensating for the &amp;quot;if&amp;quot; inside the loop. &lt;/p&gt;
&lt;p&gt;public string CommaDelimited(IEnumerable&amp;lt;string&amp;gt; someCollection)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int count = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string element in someCollection)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(element).Append(&amp;quot;,&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//register operation should not be expensive&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;count ++;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//remove trailing comma&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (sb.Length &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Remove(sb.Length - 1, 1);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (count &amp;gt; 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int index = sb.Length - 1;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (sb[index] != ',')&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;index--;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Remove(index, 1);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Insert(index, &amp;quot; And &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.Insert(0, &amp;quot;{&amp;quot;).Append(&amp;quot;}&amp;quot;).ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554792</link><pubDate>Sat, 18 Apr 2009 05:07:01 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554792</guid><dc:creator>Jagannath</dc:creator><description>&lt;p&gt;I am sorry. This is my third post. I am confused by the amount of code everyone is writing. As far as I understood, this is my program which Joins the string with and without duplicate entries. I considered comma and brace as strings and did not ignore them. &lt;/p&gt;
&lt;p&gt;@Eric. Sorry for the duplicate entries if I did not understand the problem.&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Diagnostics;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Collections;&lt;/p&gt;
&lt;p&gt;using System.Linq;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;namespace CommaQuibble&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; static class Program&lt;/p&gt;
&lt;p&gt; &amp;nbsp; {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IEnumerable&amp;lt;string&amp;gt; elems = BuildStringArray();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System.Diagnostics.Stopwatch sw = new Stopwatch();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sw.Start(); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; string s = JoinWithDups(elems.ToArray&amp;lt;string&amp;gt;(), &amp;quot;,&amp;quot;, &amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; string s2 = JoinWithoutDups(elems.ToArray&amp;lt;string&amp;gt;(), &amp;quot;,&amp;quot;, &amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TimeSpan ts = sw.Elapsed;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Console.WriteLine(s);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Console.WriteLine(ts.TotalSeconds);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; static IEnumerable&amp;lt;string&amp;gt; BuildStringArray()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; string alphabets = &amp;quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Random random = new Random(DateTime.Now.Ticks.GetHashCode());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (int i = 0; i &amp;lt; 100000; i++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int min = random.Next(10, 25);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int max = random.Next(min, 25);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; yield return alphabets.Substring(min, max - min + 1);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; public static string JoinWithoutDups (string[] source,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; string delimeter1,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; string delimeter2)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int NumElem = source.Count();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; StringBuilder finalString = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Dictionary&amp;lt;string, int&amp;gt; duplicates = new Dictionary&amp;lt;string, int&amp;gt;();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (int i = 0; i &amp;lt; NumElem - 1;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (duplicates.ContainsKey(source[i]) == false)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; finalString.Append(string.Format(&amp;quot;{0}{1}&amp;quot;, source[i], delimeter1));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; duplicates[source[i]] = 1; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; i++;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (NumElem &amp;gt; 0 &amp;amp;&amp;amp; (duplicates.ContainsKey(source[NumElem - 1]) == false))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; finalString.Append(delimeter2);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; finalString.Append(source[NumElem - 1]);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; finalString.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return finalString.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; public static string JoinWithDups (string[] source,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string delimeter1,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string delimeter2)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int NumElem = source.Count();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; StringBuilder finalString = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (int i = 0; i &amp;lt; NumElem - 1; )&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; finalString.Append(string.Format(&amp;quot;{0}{1}&amp;quot;, source[i], delimeter1));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; i++;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (NumElem &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; finalString.Append(delimeter2);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; finalString.Append(source[NumElem - 1]);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; finalString.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return finalString.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554794</link><pubDate>Sat, 18 Apr 2009 05:09:31 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554794</guid><dc:creator>Abhijeet Patel</dc:creator><description>&lt;p&gt;@Eric: My apologies for a duplicate submission. Looks like my &amp;quot;interpretation&amp;quot; was a &amp;quot;misinterpretation&amp;quot;, in that I overlooked the fact that the words themselves can contain &amp;quot;{&amp;quot; &amp;nbsp;&amp;quot;,&amp;quot; &amp;nbsp;&amp;quot;}&amp;quot;&lt;/p&gt;
&lt;p&gt;My interpretation was that the word could be either a complete word without these characters or the word is a special character or a combination of these special characters thereof.&lt;/p&gt;
&lt;p&gt;I've updated my solution to correct my &amp;quot;misinterpretation&amp;quot; and I'm re-submitting the solution.&lt;/p&gt;
&lt;p&gt;(a couple of small changes) &lt;/p&gt;
&lt;p&gt;Hope multiple submission are not a ground for dismissals :-)&lt;/p&gt;
&lt;p&gt;The file I'm using &amp;quot;Words.txt&amp;quot; can be downloaded from &lt;/p&gt;
&lt;p&gt;&amp;lt;a href=&amp;quot;&lt;a rel="nofollow" target="_new" href="http://geocities.com/linqrocks/Words.txt&amp;quot;&amp;gt;here&amp;lt;/a&amp;gt;"&gt;http://geocities.com/linqrocks/Words.txt&amp;quot;&amp;gt;here&amp;lt;/a&amp;gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The performance for approx. 160 words is 53 seconds. &lt;/p&gt;
&lt;p&gt;I also tried it for 173,000 words(which can be downloaded from &amp;lt;a href=&amp;quot;&lt;a rel="nofollow" target="_new" href="http://geocities.com/linqrocks/Word.txt&amp;quot;&amp;gt;here&amp;lt;/a&amp;gt;"&gt;http://geocities.com/linqrocks/Word.txt&amp;quot;&amp;gt;here&amp;lt;/a&amp;gt;&lt;/a&gt; and the performance was absymal mainly due to the 'Aggregate' function I'm using.&lt;/p&gt;
&lt;p&gt;Any tips on making this more performant would be MUCH appreciated.&lt;/p&gt;
&lt;p&gt;Here goes:&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public static IEnumerable&amp;lt;string&amp;gt; GetWords(string fileName)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;using (StreamReader reader = new StreamReader(fileName))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while(!reader.EndOfStream)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string word = reader.ReadLine();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return word;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield break;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string Concat(IEnumerable&amp;lt;string&amp;gt; words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[] excludesStrArr = { &amp;quot;,&amp;quot;, &amp;quot;{&amp;quot;, &amp;quot;}&amp;quot;, &amp;quot;&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;char[] excludesChrArr = excludesStrArr.Except(Enumerable.Repeat(excludesStrArr.Last(),1))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Select(s =&amp;gt; Convert.ToChar(s)).ToArray();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string str;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words = words.Select(s =&amp;gt; s.Trim().Trim(excludesChrArr)).Except(excludesStrArr);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(words.SequenceEqual(Enumerable.Empty&amp;lt;string&amp;gt;()))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;str = &amp;quot;{}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return str;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(words.ElementAtOrDefault(0) != null &amp;amp;&amp;amp; words.ElementAtOrDefault(1) == null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;str = words.SingleOrDefault();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return str;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (words.ElementAtOrDefault(1) != null &amp;amp;&amp;amp; words.ElementAtOrDefault(2) == null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;str = string.Concat(&amp;quot;{&amp;quot;, words.ElementAt(0), &amp;quot; and &amp;quot;, words.ElementAt(1), &amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return str;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string s = words.Aggregate((w1, w2) =&amp;gt; string.Concat(w1, &amp;quot;,&amp;quot;, w2));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(s);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Replace(&amp;quot;,&amp;quot;, &amp;quot; and &amp;quot; , s.LastIndexOfAny(new char[]{','}),1);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;str = sb.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;str = string.Concat(&amp;quot;{&amp;quot;, str, &amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return str;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Stopwatch watch = new Stopwatch();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var words = GetWords(&amp;quot;Words.txt&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;watch.Start(); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(Concat(words));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;watch.Stop();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Debug.WriteLine(string.Format(&amp;quot;StrConcat took {0} Milliseconds&amp;quot;, watch.Elapsed.Milliseconds)); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554797</link><pubDate>Sat, 18 Apr 2009 05:12:54 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554797</guid><dc:creator>Abhijeet Patel</dc:creator><description>&lt;p&gt;@Jagannath &lt;/p&gt;
&lt;p&gt;You are correct, I misinterpreted the requirement, please check out the previous comment in which I've updated my solution to include the &amp;quot;fix&amp;quot;&lt;/p&gt;
&lt;p&gt;The file I'm using can be &amp;nbsp;downloaded from &lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_new" href="http://geocities.com/linqrocks/Word.txt"&gt;http://geocities.com/linqrocks/Word.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554802</link><pubDate>Sat, 18 Apr 2009 05:36:34 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554802</guid><dc:creator>Bill Gates</dc:creator><description>&lt;p&gt;I thought IronPython was supposed to plug these holes!&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554850</link><pubDate>Sat, 18 Apr 2009 07:45:16 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554850</guid><dc:creator>Abhijeet Patel</dc:creator><description>&lt;p&gt;@Eric: P.S. That's 53 Milliseconds not Seconds&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554888</link><pubDate>Sat, 18 Apr 2009 10:00:10 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554888</guid><dc:creator>David Fowler</dc:creator><description>&lt;p&gt;If your into problem solving eric (and we all are) here's a good question:&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_new" href="http://acm.tju.edu.cn/toj/showp3036.html"&gt;http://acm.tju.edu.cn/toj/showp3036.html&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554906</link><pubDate>Sat, 18 Apr 2009 10:48:10 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554906</guid><dc:creator>Faredoon</dc:creator><description>&lt;p&gt;Ive used the following two steps:&lt;/p&gt;
&lt;p&gt;1) Insert commas at every alternate position in the list&lt;/p&gt;
&lt;p&gt;2) replaces the last comma with an &amp;quot;and&amp;quot;.&lt;/p&gt;
&lt;p&gt;Code:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public string insertCommas(IEnumerable&amp;lt;string&amp;gt; stringList)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IEnumerable&amp;lt;string&amp;gt; listWithCommas = _insertCommas(stringList);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder builder = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string item in listWithCommas)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(item);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return builder.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private IEnumerable&amp;lt;string&amp;gt; _insertCommas(IEnumerable&amp;lt;string&amp;gt; stringList)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;string&amp;gt; list = stringList.ToList();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (list.Count - 1 &amp;lt;= 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return stringList;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int index = 1; index &amp;lt; list.Count; index+=2)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list.Insert(index, &amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;list[list.LastIndexOf(&amp;quot;, &amp;quot;)] = &amp;quot; and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return list;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554910</link><pubDate>Sat, 18 Apr 2009 10:50:29 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554910</guid><dc:creator>Abhijeet Patel</dc:creator><description>&lt;p&gt;I guess I'm a glutton for trying to improve performance, so I decided to take another hack at it :) &amp;nbsp;&lt;/p&gt;
&lt;p&gt;I was able to bring the time down to &lt;/p&gt;
&lt;p&gt;0.36 seconds for approx 173,528 words:&lt;/p&gt;
&lt;p&gt;Here are the test files I used:&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_new" href="http://geocities.com/linqrocks/Word.txt"&gt;http://geocities.com/linqrocks/Word.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_new" href="http://geocities.com/linqrocks/Words.txt"&gt;http://geocities.com/linqrocks/Words.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Code follows:&lt;/p&gt;
&lt;p&gt;public static IEnumerable&amp;lt;string&amp;gt; GetWords(string fileName)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;using (StreamReader reader = new StreamReader(fileName))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while(!reader.EndOfStream)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string word = reader.ReadLine();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return word;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield break;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string Concat(IEnumerable&amp;lt;string&amp;gt; words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[] excludesStrArr = { &amp;quot;,&amp;quot;, &amp;quot;{&amp;quot;, &amp;quot;}&amp;quot;, &amp;quot;&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;char[] excludesChrArr = excludesStrArr.Except(Enumerable.Repeat(excludesStrArr.Last(),1))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.Select(s =&amp;gt; Convert.ToChar(s)).ToArray();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string str;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words = words.Select(s =&amp;gt; s.Trim().Trim(excludesChrArr)).Except(excludesStrArr);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(words.SequenceEqual(Enumerable.Empty&amp;lt;string&amp;gt;()))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;str = &amp;quot;{}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return str;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(words.ElementAtOrDefault(0) != null &amp;amp;&amp;amp; words.ElementAtOrDefault(1) == null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;str = words.SingleOrDefault();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return str;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (words.ElementAtOrDefault(1) != null &amp;amp;&amp;amp; words.ElementAtOrDefault(2) == null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;str = string.Concat(&amp;quot;{&amp;quot;, words.ElementAt(0), &amp;quot; and &amp;quot;, words.ElementAt(1), &amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return str;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string s = words.Aggregate((w1, w2) =&amp;gt; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{sb.Append(w1);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sb.Append(&amp;quot;,&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sb.Append(w2);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int index = sb.Length - 1;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (sb[index] != ',')&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;index--;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Replace(&amp;quot;,&amp;quot;, &amp;quot; and &amp;quot;, index, 1);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;str = sb.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return str;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Stopwatch watch = new Stopwatch();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var words = GetWords(&amp;quot;Word.txt&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;watch.Start();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string str = Concat(words);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;watch.Stop();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Debug.WriteLine(string.Format(&amp;quot;StrConcat took {0} Milliseconds&amp;quot;, watch.Elapsed.Milliseconds)); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(str);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554919</link><pubDate>Sat, 18 Apr 2009 11:09:10 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554919</guid><dc:creator>Puneet</dc:creator><description>&lt;p&gt;A nice old school imperative style solution:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string ConcatenateStringsWithCommas(IEnumerable&amp;lt;string&amp;gt; enumerable)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (enumerable == null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int idx = 0, len = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string comma = &amp;quot;, &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string s in enumerable)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(idx++ &amp;gt;= 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(comma);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(s);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;len = s.Length + comma.Length;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(idx &amp;gt; 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Replace(comma, &amp;quot; AND &amp;quot;, sb.Length - len, comma.Length);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9554933</link><pubDate>Sat, 18 Apr 2009 11:34:57 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9554933</guid><dc:creator>Fred Hirschfeld</dc:creator><description>&lt;P&gt;How about just this simple solution...&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[] elements = new string[] { "ABC", "DEF", "GC", "Z" };&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string s = string.Join(", ", elements);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(Regex.Replace(s, "^(.*, [^,]*)(?:, )([^,]*)$", "$1 and $2"));&lt;/P&gt;
&lt;DIV class=yellowbox&gt;
&lt;P&gt;What if the strings contain commas? And where are the braces? -- Eric&lt;/P&gt;&lt;/DIV&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9555087</link><pubDate>Sat, 18 Apr 2009 19:05:43 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9555087</guid><dc:creator>Fred Hirschfeld</dc:creator><description>&lt;P&gt;string[] elements1 = new string[] { "ABC" }; &lt;BR&gt;string[] elements2 = new string[] { "ABC", "DEF" }; &lt;BR&gt;string[] elements3 = new string[] { "ABC", "DEF", "GC", "Z" }; &lt;BR&gt;string s = string.Join(", ", elements1); &lt;BR&gt;Console.WriteLine(Regex.Replace(s, "^(.*, )?([^,]*)(?:, )([^,]*)$", "$1$2 and $3")); &lt;BR&gt;s = string.Join(", ", elements2); &lt;BR&gt;Console.WriteLine(Regex.Replace(s, "^(.*, )?([^,]*)(?:, )([^,]*)$", "$1$2 and $3")); &lt;BR&gt;s = string.Join(", ", elements3); &lt;BR&gt;Console.WriteLine(Regex.Replace(s, "^(.*, )?([^,]*)(?:, )([^,]*)$", "$1$2 and $3")); &lt;/P&gt;
&lt;P&gt;Just realized that the code did not work in all scenarios... the above would though.&lt;/P&gt;
&lt;DIV class=yellowbox&gt;
&lt;P&gt;Again, what if one of the strings contained commas? Suppose the strings were "(1, 2)", "(2, 4)" and "(4, 8)", for example? And still no braces! -- Eric&lt;/P&gt;&lt;/DIV&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9555184</link><pubDate>Sat, 18 Apr 2009 22:49:32 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9555184</guid><dc:creator>Sandeep</dc:creator><description>&lt;p&gt;For Fred's soln, converting IEnumerable&amp;lt;&amp;gt; to string[] would require explicit conversion, wouldn't it? And I would guess that the performance hit is significant. I'd really like Eric's view on performance here...readability can be fixed once we understand the best approach. &lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9555191</link><pubDate>Sat, 18 Apr 2009 23:00:32 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9555191</guid><dc:creator>Abhijeet Patel</dc:creator><description>&lt;p&gt;In general converting the IEnumerable&amp;lt;string&amp;gt; to a list/array will definitely have significant perf. impact. The more you can stay in the IEnumerable land without explicitly materializing the underlying objects, the better off you are. Imagine if your data source had 1 million words, you would be shot from the get go. Also bear in mind that when you perform any operations on the &amp;quot;String&amp;quot; class you create a new &amp;quot;String&amp;quot; since strings are immutable so if you're doing any search/replace/concat operations on a large string good luck!&lt;/p&gt;
&lt;p&gt;Just my 2 cents&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9555480</link><pubDate>Sun, 19 Apr 2009 08:45:09 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9555480</guid><dc:creator>The First Nick</dc:creator><description>&lt;p&gt;It's been several days since I posted my first try (and my attempt at a funny try), and having some free time today (having just finished with finals! :), I thought maybe I'd try doing it only using the IEnumerable (not converting to a list or array) without being too fancy. &amp;nbsp;Here's what I came up with; it seems to work pretty well and didn't really take that long to write (the whole program follows, explanation below):&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Linq;&lt;/p&gt;
&lt;p&gt;namespace Scratch&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;class Program&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static List&amp;lt;string&amp;gt; words;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//string[] input = { };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//string[] input = { &amp;quot;ABC&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//string[] input = { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//string[] input = { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot;, &amp;quot;I&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string output = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var watch = new System.Diagnostics.Stopwatch();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IEnumerable&amp;lt;string&amp;gt; input = GetWords(&amp;quot;english.txt&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;watch.Start();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output = FormatEnumerableStrings(input);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;watch.Stop();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(String.Format(&amp;quot;ToList() time elapsed: &amp;nbsp; &amp;nbsp;{0} milliseconds&amp;quot;, watch.ElapsedMilliseconds));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;watch.Reset(); watch.Start();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;output = FormatEnumerableStrings2(input);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;watch.Stop();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(String.Format(&amp;quot;Enumerative time elapsed: {0} milliseconds&amp;quot;, watch.ElapsedMilliseconds));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Console.WriteLine(output);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// New function that does not use ToList()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string FormatEnumerableStrings2(IEnumerable&amp;lt;string&amp;gt; input)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var sb = new System.Text.StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var it = input.GetEnumerator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(input.FirstOrDefault());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;it.MoveNext();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (it.MoveNext()) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string next = it.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string prev = next;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (it.MoveNext()) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;prev = next;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;next = it.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(prev);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(next);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.Append(&amp;quot;}&amp;quot;).ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Initial function that uses ToList()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string FormatEnumerableStrings(IEnumerable&amp;lt;string&amp;gt; input)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var sb = new System.Text.StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var strings = input.ToList();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int count = strings.Count;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (count &amp;gt; 0) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(strings[0]);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 1; i &amp;lt; count - 1; i++) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(strings[i]);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (count &amp;gt; 1) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(strings[count - 1]);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.Append(&amp;quot;}&amp;quot;).ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static IEnumerable&amp;lt;string&amp;gt; GetWords(string file)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words = new List&amp;lt;string&amp;gt;();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string line;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;using (var txt = new System.IO.StreamReader(file)) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while ((line = txt.ReadLine()) != null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;words.Add(line);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return words.AsEnumerable();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;I'm pretty sure this is less clear than my initial iterative approach (my April 15, 2009 6:11 PM post) as this has two variables keeping track of words instead of just one. &amp;nbsp;When I did some testing on a huge word list[1]; however, I found that the performance of my initial approach using ToList() is almost the exact same as the second attemp without ToList(). &amp;nbsp;Looking at the MSDN page[2] for it I don't see any mention of time complexity (some pages explicitly mention a Big Oh), however I suppose this may be due to how I'm using a List as the source for my IEnumerable (?).&lt;/p&gt;
&lt;p&gt;On my machine I can run both algorithms against 192,718 words[2] in about 0.035 seconds. Hopefully I haven't made any completely obvious mistakes.&lt;/p&gt;
&lt;p&gt;[1]: english-words.95 in &lt;a rel="nofollow" target="_new" href="http://downloads.sourceforge.net/wordlist/scowl-6.zip"&gt;http://downloads.sourceforge.net/wordlist/scowl-6.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[2]: &lt;a rel="nofollow" target="_new" href="http://msdn.microsoft.com/en-us/library/bb342261.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb342261.aspx&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9555481</link><pubDate>Sun, 19 Apr 2009 08:48:51 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9555481</guid><dc:creator>The First Nick</dc:creator><description>&lt;p&gt;Dur. &amp;nbsp;Probably obvious, but &amp;quot;192,718 words&amp;quot; should reference the first footnote, not the second.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9555643</link><pubDate>Sun, 19 Apr 2009 14:47:49 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9555643</guid><dc:creator>[ICR]</dc:creator><description>&lt;p&gt;@Jon Skeet&lt;/p&gt;
&lt;p&gt;Yah, I realised about half way through I was basically re-implementing what you had already done. I suppose I am a little naughty for not giving you the credit in the post after. I should also have actually looked at your code when I had realised and reused some of it :)&lt;/p&gt;
&lt;p&gt;My code is a little verbose - it was more of a brain dump than carefully crafted code. Thanks for the tip about IEnumerator being disposable - if I'd have been in a proper .NET IDE rather than Vim I hopefully would have picked that up :P&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9555683</link><pubDate>Sun, 19 Apr 2009 17:07:24 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9555683</guid><dc:creator>[ICR]</dc:creator><description>&lt;p&gt;@The First Nick&lt;/p&gt;
&lt;p&gt;When you are testing the ToList solution are you testing it by passing in a List&amp;lt;T&amp;gt; cast to an IEnumerable&amp;lt;T&amp;gt;? I'm fairly sure ToList has a shortcut that checks if the object is really a list. Try it with passing in an IEnumerable that isn't actually a List (a Queue would probably work quite well for a quick check).&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9555689</link><pubDate>Sun, 19 Apr 2009 17:15:45 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9555689</guid><dc:creator>[ICR]</dc:creator><description>&lt;p&gt;I worked on my annotated enumerable solution a bit more. By making it more generic I was actually able to cut the code down using array index manipulation. This code annotates an enumerable with its index and also, for items Lookahead away from the end, the length of the enumerable. Using a Lookahead value of 2 you can therefore check if an item is the penultimate item. The algorithm for consuming the code is very similar to my last solution, so I won't post it here.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public class AnnotatedItem&amp;lt;T&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;	public T Value { get; set; }&lt;/p&gt;
&lt;p&gt;	public int Index { get; set; }&lt;/p&gt;
&lt;p&gt;	public int? Length { get; set; }&lt;/p&gt;
&lt;p&gt;	public bool IsFirst { get { return (Index == 0); } }&lt;/p&gt;
&lt;p&gt;	public bool IsLast { get { return Length.HasValue &amp;amp;&amp;amp; (Index == (Length.Value - 1)); } }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public class AnnotatedEnumerable&amp;lt;T&amp;gt; : IEnumerable&amp;lt;AnnotatedItem&amp;lt;T&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;	public IEnumerable&amp;lt;T&amp;gt; Origional { get; private set; }&lt;/p&gt;
&lt;p&gt;	public int Lookahead { get; private set; }&lt;/p&gt;
&lt;p&gt;	public AnnotatedEnumerable(IEnumerable&amp;lt;T&amp;gt; enumerable, int lookahead)&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;if (lookahead &amp;lt; 1)&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;		throw new ArgumentOutOfRangeException(&amp;quot;lookahead&amp;quot;);&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;Origional = enumerable;&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;Lookahead = lookahead;&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;	public AnnotatedEnumerable(IEnumerable&amp;lt;T&amp;gt; enumerable)&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;: this(enumerable, 1) { }&lt;/p&gt;
&lt;p&gt;	public IEnumerator&amp;lt;AnnotatedItem&amp;lt;T&amp;gt;&amp;gt; GetEnumerator()&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;using (IEnumerator&amp;lt;T&amp;gt; enumerator = Origional.GetEnumerator())&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;		int index = 0, head = 0, streamLength = 0;&lt;/p&gt;
&lt;p&gt;		T[] values = new T[Lookahead];&lt;/p&gt;
&lt;p&gt;		// Yield and fill&lt;/p&gt;
&lt;p&gt;		while (enumerator.MoveNext())&lt;/p&gt;
&lt;p&gt;		{&lt;/p&gt;
&lt;p&gt;		 &amp;nbsp; &amp;nbsp;// If the array has been filled, then yield the item in it before replacing it.&lt;/p&gt;
&lt;p&gt;		 &amp;nbsp; &amp;nbsp;if (streamLength == Lookahead)&lt;/p&gt;
&lt;p&gt;		 &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;			yield return new AnnotatedItem() { Value = values[head], Index = index, Length = null };&lt;/p&gt;
&lt;p&gt;			index += 1;&lt;/p&gt;
&lt;p&gt;		 &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;		 &amp;nbsp; &amp;nbsp;values[head] = enumerator.Current;&lt;/p&gt;
&lt;p&gt;		 &amp;nbsp; &amp;nbsp;head = Wrap(head + 1);&lt;/p&gt;
&lt;p&gt;		 &amp;nbsp; &amp;nbsp;streamLength = Math.Min(streamLength + 1, Lookahead);&lt;/p&gt;
&lt;p&gt;		}&lt;/p&gt;
&lt;p&gt;		// Annotate and yield&lt;/p&gt;
&lt;p&gt;		int enumerableLength = index + streamLength;&lt;/p&gt;
&lt;p&gt;		for (int i = 0, p = Wrap(head - streamLength); i &amp;lt; streamLength; i += 1, p = Wrap(p + 1))&lt;/p&gt;
&lt;p&gt;		{&lt;/p&gt;
&lt;p&gt;		 &amp;nbsp; &amp;nbsp;yield return new AnnotatedItem() { Value = values[p], Index = index, Length = enumerableLength };&lt;/p&gt;
&lt;p&gt;		 &amp;nbsp; &amp;nbsp;index += 1;&lt;/p&gt;
&lt;p&gt;		}&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;	private int Wrap(int i)&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;i = i % Lookahead;&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;if (i &amp;lt; 0)&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt;		return i + Lookahead;&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;	 &amp;nbsp; &amp;nbsp;return i;&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9555911</link><pubDate>Mon, 20 Apr 2009 00:08:34 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9555911</guid><dc:creator>Eugene Baranov</dc:creator><description>&lt;p&gt;// Should be efficient due to immutable nature of string in .NET&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static class CommaQuibbler&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string Quibble(IEnumerable&amp;lt;string&amp;gt; words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string result = String.Empty,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; previousResult = String.Empty,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lastWord = String.Empty,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; glue = &amp;quot;, &amp;quot;,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lastGlue = &amp;quot; and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int count = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string word in words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;previousResult = result;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result += (count++ &amp;gt; 0 ? glue : String.Empty) + word;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;lastWord = word;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (previousResult != String.Empty)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = previousResult + lastGlue + lastWord;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return '{' + result + '}';&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;/* PS. Special thanks to you for your posts about immutability!&lt;/p&gt;
&lt;p&gt; * I was amazed when immutable List saved me about 2Gb of RAM for one computational task!&lt;/p&gt;
&lt;p&gt; */&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9556125</link><pubDate>Mon, 20 Apr 2009 05:10:33 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9556125</guid><dc:creator>The First Nick</dc:creator><description>&lt;p&gt;ICR:&lt;/p&gt;
&lt;p&gt;Interesting thought. &amp;nbsp;I did some additional testing with an enormous word list[1] containing about 2.7 million words/phrases with the following results (an average of 10 runs) using my posted code:&lt;/p&gt;
&lt;p&gt;Source: List&amp;lt;string&amp;gt;&lt;/p&gt;
&lt;p&gt;ToList() time: 295 ms&lt;/p&gt;
&lt;p&gt;Enumerable time: 320 ms&lt;/p&gt;
&lt;p&gt;Source: Queue&amp;lt;string&amp;gt;&lt;/p&gt;
&lt;p&gt;ToList() time: 415 ms&lt;/p&gt;
&lt;p&gt;Enumerable time: 340 ms&lt;/p&gt;
&lt;p&gt;Source: HashSet&amp;lt;string&amp;gt;&lt;/p&gt;
&lt;p&gt;ToList() time: 325 ms&lt;/p&gt;
&lt;p&gt;Enumerable time: 330 ms&lt;/p&gt;
&lt;p&gt;So yes, it looks like calling ToList() on an IEnumerable&amp;lt;T&amp;gt; backed by a List&amp;lt;T&amp;gt; is faster than other collections, but not by much. &amp;nbsp;One thing I did notice is that I can cut both times by about 25-35% by defining the StringBuilder's initial capacity, though I don't think that's really relevant to this discussion. &amp;nbsp;In all cases, List&amp;lt;T&amp;gt; is the best performer, followed by HashSet&amp;lt;T&amp;gt;, and finally Queue&amp;lt;T&amp;gt;.&lt;/p&gt;
&lt;p&gt;Meh, I suppose this is getting beyond the point of Eric's post, but I think it's interesting anyway. &amp;nbsp;Better than sitting around bored on a Sunday afternoon.&lt;/p&gt;
&lt;p&gt;[1]: &lt;a rel="nofollow" target="_new" href="http://www.zinkwazi.com/tools/wordlist.zip"&gt;http://www.zinkwazi.com/tools/wordlist.zip&lt;/a&gt; (30 MB uncompressed)&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9556576</link><pubDate>Mon, 20 Apr 2009 15:11:21 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9556576</guid><dc:creator>ptoniolo</dc:creator><description>&lt;p&gt;@First Nick: your FormatEnumerableStrings2 is just the same as mine but I don't agree on some passages:&lt;/p&gt;
&lt;p&gt;1) You use the .FirstOrDefault() method, but this is not part of the IEnumerable definition: it comes from the Linq extensions... you have avoided all the others extensions, why do you think you still need this? It should be better to append the Current under an &amp;quot;if(MoveNext)&amp;quot;! Remember: the iterator is initially positioned before the first (if ever) element.&lt;/p&gt;
&lt;p&gt;2) In the loop you have two string vars, but you really need only one: see what happens when you assign Current _after_ appending the previous instance!&lt;/p&gt;
&lt;p&gt;3) I don't like the two MoveNext at the beginning: maybe this is not the case for the IEnumerator, but there are programming metaphors in which you have to catch the first &amp;quot;exception&amp;quot;, because a subsequent call will return another &amp;quot;state&amp;quot;. Suppose the list was empty: the first MoveNext returns false, but you lose the return status, and you have to call it again to get an information that was already given to you!&lt;/p&gt;
&lt;p&gt;The points 1 and 3 are actually for the same problem: if you simply put the first append after an &amp;quot;if(MoveNext)&amp;quot; (i.e.: my solution), I think you just have a more robust code!&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9556793</link><pubDate>Mon, 20 Apr 2009 18:10:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9556793</guid><dc:creator>ptoniolo</dc:creator><description>&lt;p&gt;I didn't realize that IEnumerator&amp;lt;T&amp;gt; implements the IDisposable interface! I believe that a better solution is to declare the enumerator inside a &amp;quot;using&amp;quot; statement, as follows:&lt;/p&gt;
&lt;p&gt;string Stringize(IEnumerable&amp;lt;string&amp;gt; list) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp;var sb = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;using(var e = list.GetEnumerator())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if(e.MoveNext()) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(e.Current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(e.MoveNext()) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var current = e.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while(e.MoveNext()) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;, &amp;quot;).Append(current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;current = e.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot; and &amp;quot;).Append(current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;return sb.Append(&amp;quot;}&amp;quot;).ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;BTW: using the &amp;quot;var&amp;quot; declaration you can easily convert this function to a generic method, by changing only the first line:&lt;/p&gt;
&lt;p&gt; &amp;nbsp;string Stringize&amp;lt;T&amp;gt;(IEnumerable&amp;lt;T&amp;gt; list) {&lt;/p&gt;
&lt;p&gt;Without the &amp;quot;var&amp;quot; you should also change the other explicit declarations: StringBuilder, IEnumerator&amp;lt;T&amp;gt; and T.&lt;/p&gt;
&lt;p&gt;Sorry for the cluttering of the thread... I'm sure this is the last refinement in my code!&lt;/p&gt;
&lt;p&gt;Ciao&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9556899</link><pubDate>Mon, 20 Apr 2009 19:37:02 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9556899</guid><dc:creator>Elliott O'Hara</dc:creator><description>&lt;p&gt;First Try, I'm sure GetJoinedValue can be prettied up a bit...&lt;/p&gt;
&lt;p&gt; &amp;nbsp; [TestFixture]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public class IEnumberableExtensionsTestFixture&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private IEnumerable&amp;lt;String&amp;gt; testEnumerable;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private string expectedResults;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[TearDown]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void AssertAll()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var actualResults = testEnumerable.ToNonOxfordCommaString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.That(actualResults, Is.EqualTo(expectedResults));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void an_empty_string_returns_empty_curly_braces()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;testEnumerable = new List&amp;lt;String&amp;gt; { &amp;quot;&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expectedResults = &amp;quot;{}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void a_single_value_is_wrapped_in_curly_braces()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;testEnumerable = new List&amp;lt;String&amp;gt; {&amp;quot;ABC&amp;quot;};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expectedResults = &amp;quot;{ABC}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void two_values_uses_and_to_join()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;testEnumerable = new List&amp;lt;String&amp;gt; {&amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expectedResults = &amp;quot;{ABC and DEF}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Test]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void more_than_2_values_use_commas_with_and_as_the_last_value()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;testEnumerable = new List&amp;lt;String&amp;gt; { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expectedResults = &amp;quot;{ABC,DEF,G and H}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public static class IEnumberableExtensions&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/// Retuns a joined string with &amp;quot;and&amp;quot; as the last join.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string ToNonOxfordCommaString(this IEnumerable&amp;lt;String&amp;gt; enumberable)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var joinedValue = GetJoinedValue(enumberable);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return String.Format(&amp;quot;{{{0}}}&amp;quot;,joinedValue);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static string GetJoinedValue(IEnumerable&amp;lt;string&amp;gt; enumberable)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var totalCount = enumberable.Count();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var lastValue = enumberable.ToList()[totalCount - 1];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch (totalCount)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 0:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return String.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 1:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return lastValue;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return String.Join(&amp;quot;,&amp;quot;,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; enumberable.Take(totalCount - 1).ToArray()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ) + &amp;quot; and &amp;quot; + lastValue;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9556963</link><pubDate>Mon, 20 Apr 2009 20:14:14 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9556963</guid><dc:creator>Andy Galkin</dc:creator><description>&lt;p&gt;Hi.&lt;/p&gt;
&lt;p&gt;This is my version of solution.&lt;/p&gt;
&lt;p&gt;Hope you like it :)&lt;/p&gt;
&lt;p&gt;Tried to make it as simple as possible.&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Diagnostics;&lt;/p&gt;
&lt;p&gt;using System.Linq;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;namespace ConsoleApplication2&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;	class Program&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;		static void Main(string[] args)&lt;/p&gt;
&lt;p&gt;		{&lt;/p&gt;
&lt;p&gt;			Debug.Assert(new string[]{}.AddCommas()==&amp;quot;{}&amp;quot;);&lt;/p&gt;
&lt;p&gt;			Debug.Assert(new string[]{&amp;quot;ABC&amp;quot;}.AddCommas()==&amp;quot;{ABC}&amp;quot;);&lt;/p&gt;
&lt;p&gt;			Debug.Assert(new string[]{&amp;quot;ABC&amp;quot;,&amp;quot;DEF&amp;quot;}.AddCommas()==&amp;quot;{ABC and DEF}&amp;quot;);&lt;/p&gt;
&lt;p&gt;			Debug.Assert(new string[]{&amp;quot;ABC&amp;quot;,&amp;quot;DEF&amp;quot;,&amp;quot;G&amp;quot;,&amp;quot;H&amp;quot;}.AddCommas()==&amp;quot;{ABC, DEF, G and H}&amp;quot;);&lt;/p&gt;
&lt;p&gt;		}&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;	/*&lt;/p&gt;
&lt;p&gt;	 (1) If the sequence is empty then the resulting string is &amp;quot;{}&amp;quot;.&lt;/p&gt;
&lt;p&gt;(2) If the sequence is a single item &amp;quot;ABC&amp;quot; then the resulting string is &amp;quot;{ABC}&amp;quot;.&lt;/p&gt;
&lt;p&gt;(3) If the sequence is the two item sequence &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; then the resulting string is &amp;quot;{ABC and DEF}&amp;quot;.&lt;/p&gt;
&lt;p&gt;(4) If the sequence has more than two items, say, &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; then the resulting string is &amp;quot;{ABC, DEF, G and H}&amp;quot;. (Note: no Oxford comma!)&lt;/p&gt;
&lt;p&gt;	 */&lt;/p&gt;
&lt;p&gt;static class StringCommer&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;	public static string AddCommas(this IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;		int lastElementIndex = strings.Count();&lt;/p&gt;
&lt;p&gt;		if (lastElementIndex == 0)&lt;/p&gt;
&lt;p&gt;			return &amp;quot;{}&amp;quot;;&lt;/p&gt;
&lt;p&gt;		StringBuilder resultBuilder = new StringBuilder();&lt;/p&gt;
&lt;p&gt;		bool isFirst = true;&lt;/p&gt;
&lt;p&gt;		int currentElementIndex = 0;&lt;/p&gt;
&lt;p&gt;		resultBuilder.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt;		foreach (var currentItem in strings)&lt;/p&gt;
&lt;p&gt;		{&lt;/p&gt;
&lt;p&gt;			currentElementIndex++;&lt;/p&gt;
&lt;p&gt;			if (isFirst)&lt;/p&gt;
&lt;p&gt;				isFirst = false;&lt;/p&gt;
&lt;p&gt;			else&lt;/p&gt;
&lt;p&gt;			{&lt;/p&gt;
&lt;p&gt;				if (currentElementIndex != lastElementIndex)&lt;/p&gt;
&lt;p&gt;					resultBuilder.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt;				else&lt;/p&gt;
&lt;p&gt;					resultBuilder.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt;			}&lt;/p&gt;
&lt;p&gt;			resultBuilder.Append(currentItem);&lt;/p&gt;
&lt;p&gt;		}&lt;/p&gt;
&lt;p&gt;		resultBuilder.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt;		return resultBuilder.ToString();&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9556999</link><pubDate>Mon, 20 Apr 2009 20:33:25 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9556999</guid><dc:creator>Andy Galkin</dc:creator><description>&lt;p&gt;p.s. Yes, I can remove isFirst variable, with something like&lt;/p&gt;
&lt;p&gt;if (currentElementIndex++ != 0)&lt;/p&gt;
&lt;p&gt;				{&lt;/p&gt;
&lt;p&gt;					if (currentElementIndex != lastElementIndex)&lt;/p&gt;
&lt;p&gt;						resultBuilder.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt;					else&lt;/p&gt;
&lt;p&gt;						resultBuilder.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt;			}&lt;/p&gt;
&lt;p&gt;but don't wan't to do it :)&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9557084</link><pubDate>Mon, 20 Apr 2009 21:29:30 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9557084</guid><dc:creator>Ed</dc:creator><description>&lt;p&gt;Nothing fancy. &amp;nbsp;May not be too efficient, but fairly easy to read.&lt;/p&gt;
&lt;p&gt;public static string CombineStringWithEnglishSyntax(IEnumerable&amp;lt;String&amp;gt; strings)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;	StringBuilder builder = new StringBuilder();&lt;/p&gt;
&lt;p&gt;	// Add the starting {&lt;/p&gt;
&lt;p&gt;	builder.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt;	foreach (string item in strings)&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;		builder.Append(item);&lt;/p&gt;
&lt;p&gt;		builder.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;	// Add the ending }&lt;/p&gt;
&lt;p&gt;	builder.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt;	// Get rid of the extra comma added at the end. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;	// If there were no items added, this does nothing&lt;/p&gt;
&lt;p&gt;	builder.Replace(&amp;quot;, }&amp;quot;, &amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt;	// Find the last instance of &amp;quot;, &amp;quot; if there is one.&lt;/p&gt;
&lt;p&gt;	int lastCommaIndex = builder.ToString().LastIndexOf(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt;	if (lastCommaIndex &amp;gt;= 0)&lt;/p&gt;
&lt;p&gt;	{&lt;/p&gt;
&lt;p&gt;		// Replace the last instance of &amp;quot;, &amp;quot; with &amp;quot; and &amp;quot;.&lt;/p&gt;
&lt;p&gt;		builder.Replace(&amp;quot;, &amp;quot;, &amp;quot; and &amp;quot;, lastCommaIndex, 2);&lt;/p&gt;
&lt;p&gt;	}&lt;/p&gt;
&lt;p&gt;	return builder.ToString();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9557117</link><pubDate>Mon, 20 Apr 2009 22:06:58 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9557117</guid><dc:creator>Elliott O'Hara</dc:creator><description>&lt;p&gt;pingback from &lt;a rel="nofollow" target="_new" href="http://blog.elliottohara.com/2009/04/eric-lipperts-comma-quibbling-challenge.html"&gt;http://blog.elliottohara.com/2009/04/eric-lipperts-comma-quibbling-challenge.html&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9557188</link><pubDate>Mon, 20 Apr 2009 22:50:42 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9557188</guid><dc:creator>ErikF</dc:creator><description>&lt;p&gt;Here's a version as a batch file! (Put the elements that you want to join as arguments to the batch file.) &amp;nbsp;I can't think of any plausible reason why you would do this except to show that you can. &amp;nbsp;It seems wrong to do this in a batch file though....&lt;/p&gt;
&lt;p&gt;@echo off&lt;/p&gt;
&lt;p&gt;rem Put the beginning curly brace and starting value, if any&lt;/p&gt;
&lt;p&gt;set sp={%1&lt;/p&gt;
&lt;p&gt;shift&lt;/p&gt;
&lt;p&gt;rem Zero or one elements: don't do any further processing&lt;/p&gt;
&lt;p&gt;if !%1==! goto end&lt;/p&gt;
&lt;p&gt;:mainloop&lt;/p&gt;
&lt;p&gt;rem Two or more elements: use &amp;quot;and&amp;quot; for the last element&lt;/p&gt;
&lt;p&gt;if !%2==! goto final&lt;/p&gt;
&lt;p&gt;rem Attach the elements with a comma&lt;/p&gt;
&lt;p&gt;set sp=%sp%, %1&lt;/p&gt;
&lt;p&gt;shift&lt;/p&gt;
&lt;p&gt;goto mainloop&lt;/p&gt;
&lt;p&gt;:final&lt;/p&gt;
&lt;p&gt;rem Attach the final elements with an &amp;quot;and&amp;quot; and fallthrough&lt;/p&gt;
&lt;p&gt;set sp=%sp% and %1&lt;/p&gt;
&lt;p&gt;:end&lt;/p&gt;
&lt;p&gt;echo %sp%}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9557358</link><pubDate>Tue, 21 Apr 2009 00:20:02 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9557358</guid><dc:creator>RobO</dc:creator><description>&lt;p&gt;Sorry I didn't read them all before posting (but I did read quite a few) so I hope this isn't a reapeat.&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Linq;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;namespace CommaAndTestApp&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;class CommaAndTest&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(GetPrettyString(GetStrings(0)));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(GetPrettyString(GetStrings(1)));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(GetPrettyString(GetStrings(2)));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(GetPrettyString(GetStrings(3)));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string GetPrettyString(IEnumerable&amp;lt;string&amp;gt; items)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (items == null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new Exception(&amp;quot;items is null&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int i = items.Count();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string s in items)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(s + (--i &amp;gt; 0 ? (i == 1 ? &amp;quot; and &amp;quot; : &amp;quot;, &amp;quot;) : string.Empty));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static IEnumerable&amp;lt;string&amp;gt; GetStrings(int HowMany)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[] retVal = { &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return retVal.Take(HowMany);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;p&gt;{}&lt;/p&gt;
&lt;p&gt;{a}&lt;/p&gt;
&lt;p&gt;{a and b}&lt;/p&gt;
&lt;p&gt;{a, b and c}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9557906</link><pubDate>Tue, 21 Apr 2009 04:14:43 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9557906</guid><dc:creator>Jeff Becker</dc:creator><description>&lt;p&gt;A variation using 2 stacks.&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;namespace ConsoleApplication1&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;static class Program&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(&amp;quot;{} = &amp;quot; + (new string[0]).Quibble());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(&amp;quot;{ABC} = &amp;quot; + (new string[] { &amp;quot;ABC&amp;quot; }).Quibble());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(&amp;quot;{ABC and DEF} = &amp;quot; + (new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; }).Quibble());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(&amp;quot;{ABC, DEF, G and H} = &amp;quot; + (new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; }).Quibble());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.ReadKey();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string Quibble(this IEnumerable&amp;lt;string&amp;gt; items)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var backwards = new LinkedList&amp;lt;string&amp;gt;();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var forwards = new LinkedList&amp;lt;string&amp;gt;();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (var s in items)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;backwards.AddFirst(s);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &amp;quot;}&amp;quot; is always the last character in the result string. push it&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;forwards.AddFirst(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Initially no counter was used. &amp;nbsp;However the choice between &amp;quot; and &amp;quot; and &amp;quot;, &amp;quot;,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// and when to pop the final seperator was based on unintuative comparisons&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// to stack.Count so a counter was introduced. &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var count = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string s in backwards)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;forwards.AddFirst(s);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// push &amp;quot; and &amp;quot; the first time, &amp;quot;, &amp;quot; every other time.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;forwards.AddFirst(count == 0 ? &amp;quot; and &amp;quot; : &amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;count++;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if we've pushed at least one pair of items, the top of the stack &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// is a garbage seperator. &amp;nbsp;Pop it.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (count &amp;gt; 0) &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;forwards.RemoveFirst();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// The first item is always a &amp;quot;{&amp;quot;. Push it.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;forwards.AddFirst(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string s in forwards)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(s);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9558644</link><pubDate>Tue, 21 Apr 2009 11:36:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9558644</guid><dc:creator>ptoniolo</dc:creator><description>&lt;p&gt;@Elliott O'Hara: Be careful... &amp;quot;new List&amp;lt;String&amp;gt;{&amp;quot;&amp;quot;}&amp;quot; is NOT an empty list, but a list with ONE element, the empty string. Even you unit test is wrong! Your code fails (indexing the list with -1) when the REAL empty list is passed!&lt;/p&gt;
&lt;p&gt;@Ed (and others using LastIndexOf): Remember... the strings in the list could contain commas, and maybe even the substring &amp;quot;, &amp;quot;! What do you think is happening to your code if the last string in the list passed is, say, &amp;quot;test, other test&amp;quot;?&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9559049</link><pubDate>Tue, 21 Apr 2009 15:23:50 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9559049</guid><dc:creator>NathanC</dc:creator><description>&lt;p&gt;//I was trying to go for something completely different here, not efficiency.&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;using System.Text.RegularExpressions;&lt;/p&gt;
&lt;p&gt;namespace CommaQuibler&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;class Program&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(CommatizeWithNoOxfordComma(new string[] { }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(CommatizeWithNoOxfordComma(new string[] { &amp;quot;ABC&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(CommatizeWithNoOxfordComma(new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; })); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(CommatizeWithNoOxfordComma(new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(CommatizeWithNoOxfordComma(new string[] { &amp;quot;}&amp;quot;, &amp;quot;{&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;{abc}&amp;quot;, &amp;quot;},{&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(CommatizeWithNoOxfordComma(new string[] { &amp;quot;3}&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(CommatizeWithNoOxfordComma(new string[] { &amp;quot;{3&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(CommatizeWithNoOxfordComma(new string[] { &amp;quot;{0}&amp;quot;, &amp;quot;{1}&amp;quot;, &amp;quot;{2}&amp;quot;, &amp;quot;{3}&amp;quot;, &amp;quot;{4}&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(CommatizeWithNoOxfordComma(new string[] { &amp;quot;{0}{1}{2}{3}{4}&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(CommatizeWithNoOxfordComma(new string[] { &amp;quot;4}&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(CommatizeWithNoOxfordComma(new string[] { &amp;quot;{4{}3443{}}3}3}&amp;quot;, }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(CommatizeWithNoOxfordComma(new string[] { &amp;quot;}{}3}4{3}&amp;quot; }));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(CommatizeWithNoOxfordComma(new string[] { &amp;quot;{4&amp;quot; })); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.ReadKey();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private static string CommatizeWithNoOxfordComma(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string s in strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string h;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb = new StringBuilder(string.Format(sb.ToString(), &amp;quot;{0}&amp;quot;, &amp;quot;{0}&amp;quot;, &amp;quot;{1}&amp;quot;, &amp;quot;{3}&amp;quot;, &amp;quot;{4}&amp;quot;));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;h = s.Replace(&amp;quot;{&amp;quot;,&amp;quot;{3}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;h = Regex.Replace(h,&amp;quot;(?&amp;lt;!{3)}&amp;quot;,&amp;quot;{4}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(h);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;{2}&amp;quot;); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Insert(0,&amp;quot;{3}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;{4}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return string.Format(sb.ToString(), new string[] { &amp;quot;, &amp;quot;, &amp;quot; and &amp;quot;, &amp;quot;&amp;quot;, &amp;quot;{&amp;quot;, &amp;quot;}&amp;quot; });&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9559229</link><pubDate>Tue, 21 Apr 2009 16:47:08 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9559229</guid><dc:creator>Elliott O'Hara</dc:creator><description>&lt;p&gt;@ptoniolo, yeah, already caught that (of course, after I posted)... &lt;/p&gt;
&lt;p&gt;I fixed it on my blog, but here's the code.&lt;/p&gt;
&lt;p&gt;public void no_sequences_does_not_throw_argument_out_of_range()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 53 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 54 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; testEnumerable = new List&amp;lt;String&amp;gt;();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 55 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; expectedResults = &amp;quot;{}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 56 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt;25 private static string GetJoinedValue(IEnumerable&amp;lt;string&amp;gt; enumberable)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 26 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 27 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var totalCount = enumberable.Count();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 28 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var lastValue = totalCount == 0 ?&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 29 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; String.Empty:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 30 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; enumberable.ToArray()[totalCount - 1];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 31 &lt;/p&gt;
&lt;p&gt; &amp;nbsp; 32 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; switch (totalCount)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 33 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 34 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case 0:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 35 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case 1:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 36 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return lastValue;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 37 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; default:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 38 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return String.Join(&amp;quot;,&amp;quot;,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 39 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;enumberable.Take(totalCount - 1).ToArray()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 40 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;) + &amp;quot; and &amp;quot; + lastValue;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 41 &lt;/p&gt;
&lt;p&gt; &amp;nbsp; 42 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 43 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt;Challenge now is to use polymorphic behavior and get rid of the silly switch (that could now just be an if).&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9559911</link><pubDate>Tue, 21 Apr 2009 21:05:08 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9559911</guid><dc:creator>George Dernikos</dc:creator><description>&lt;p&gt;Just saw your post (a bit late).. I see there's great response!&lt;/p&gt;
&lt;p&gt;Here is my implementation, though.&lt;/p&gt;
&lt;p&gt;class Program&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// There’s no size limit on the sequence;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// it could be tiny,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// it could be thousands of strings.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// But it will be finite.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(CommaQuibbling(GetStringSeq(0)));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(CommaQuibbling(GetStringSeq(1)));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(CommaQuibbling(GetStringSeq(5)));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(CommaQuibbling(GetStringSeq(10)));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;static string CommaQuibbling(IEnumerable&amp;lt;string&amp;gt; seq)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string result = string.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int seqCount = seq.Count();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (seqCount &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var newSeq = seq.Select((item, index) =&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (index == 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return item;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if (index &amp;lt; seqCount - 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;, &amp;quot; + item;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot; and &amp;quot; + item;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;});&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = string.Join(&amp;quot;&amp;quot;, newSeq.ToArray());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + result + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;static IEnumerable&amp;lt;string&amp;gt; GetStringSeq(int length)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (length-- &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return &amp;quot;ABC&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9560030</link><pubDate>Tue, 21 Apr 2009 21:55:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9560030</guid><dc:creator>Andy Galkin</dc:creator><description>&lt;p&gt;And the winner is &amp;nbsp;RickDaleyOptimized, I think. Very readable and avoiding redundant call to .Count() on Enumerable.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9560193</link><pubDate>Tue, 21 Apr 2009 23:00:45 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9560193</guid><dc:creator>ptoniolo</dc:creator><description>&lt;p&gt;About Rick Dailey's solution... well, I felt a little unconfortable with it, and now I understand why!&lt;/p&gt;
&lt;p&gt;The original GetCombined() fails if the first string of the list is the empty string: the list {&amp;quot;&amp;quot;,&amp;quot;x&amp;quot;} should produce &amp;quot;{ and x}&amp;quot;, but the result is only &amp;quot;{x}&amp;quot;; the first null string does not change the length of the &amp;quot;builder&amp;quot;, that has still the same length as the &amp;quot;opening&amp;quot;.&lt;/p&gt;
&lt;p&gt;Thus, GetCombinedOptimized() is a better solution, not only because it does not call the Length so many times, it also fixes this subtle bug!&lt;/p&gt;
&lt;p&gt;Anyway, I still believe that it is not a good idea to put two &amp;quot;branch&amp;quot; statements (an if and a ternary operator) inside the inner loop.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9560625</link><pubDate>Wed, 22 Apr 2009 02:12:43 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9560625</guid><dc:creator>Dejan Stanic</dc:creator><description>&lt;p&gt;Ok, my try.&lt;/p&gt;
&lt;p&gt;Basically I repacked the enumerator.&lt;/p&gt;
&lt;p&gt;--- CODE ---&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static String Solution(IEnumerable&amp;lt;String&amp;gt; words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;var sb = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (var word in Prettyfier(words))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(word);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sb.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static IEnumerable&amp;lt;String&amp;gt; Prettyfier(IEnumerable&amp;lt;String&amp;gt; words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return &amp;quot;{&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;var a = new String[3]; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (var word in words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a[0] = a[1];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a[1] = a[2];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a[2] = word;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (a[0] != null) yield return a[0] + &amp;quot;, &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (a[1] != null) yield return a[1] + &amp;quot; and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (a[2] != null) yield return a[2];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;yield return &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;--- END CODE ---&lt;/p&gt;
&lt;p&gt;Any comments?&lt;/p&gt;
&lt;p&gt;LP,&lt;/p&gt;
&lt;p&gt;Dejan&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9561507</link><pubDate>Wed, 22 Apr 2009 09:56:59 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9561507</guid><dc:creator>Andrey Titov [izobr]</dc:creator><description>&lt;p&gt;Note: all solutions that checks if current element is not the first one by StringBuilder length has the bug that if sequense begins with set of empty strings, then some commas will be lost.&lt;/p&gt;
&lt;p&gt;For example for {&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;} correct ouput should be &amp;quot;{, , &amp;nbsp;and }&amp;quot; but such solutions will produce something like &amp;quot;{}&amp;quot;.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9561511</link><pubDate>Wed, 22 Apr 2009 09:58:33 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9561511</guid><dc:creator>Rick Dailey</dc:creator><description>&lt;p&gt;Incorporating everyone's great suggestions:&lt;/p&gt;
&lt;p&gt;static string GetCombined(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;var builder = new StringBuilder('{');&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;using(var enumerator = strings.GetEnumerator())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bool hasNext = enumerator.MoveNext();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bool first = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (hasNext)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string s = enumerator.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;hasNext = enumerator.MoveNext();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (first)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;first = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(hasNext ? &amp;quot;, &amp;quot; : &amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(s);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;builder.Append('}');&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return builder.ToString();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9561558</link><pubDate>Wed, 22 Apr 2009 10:23:29 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9561558</guid><dc:creator>Rick Dailey</dc:creator><description>&lt;p&gt;Doh, comments box doesn't have intellisense... '{' should be a string &amp;quot;{&amp;quot; in constructor, not char.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9563176</link><pubDate>Wed, 22 Apr 2009 23:59:42 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9563176</guid><dc:creator>DRBlaise</dc:creator><description>&lt;p&gt;My second try for what I believe is very readable and maintainable code&lt;/p&gt;
&lt;p&gt;public static string CommaQuibbling(this IEnumerable&amp;lt;string&amp;gt; items)&lt;/p&gt;
&lt;p&gt;{ &amp;nbsp; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;var builder = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;using (IEnumerator&amp;lt;string&amp;gt; enumtor = items.GetEnumerator())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return builder.AppendBracketed(enumtor).ToString();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;private static StringBuilder AppendBracketed(this StringBuilder builder, IEnumerator&amp;lt;string&amp;gt; enumtor)&lt;/p&gt;
&lt;p&gt;{ &amp;nbsp; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return builder.Append('{').AppendZeroOrMore(enumtor).Append('}');&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;private static StringBuilder AppendZeroOrMore(this StringBuilder builder, IEnumerator&amp;lt;string&amp;gt; enumtor)&lt;/p&gt;
&lt;p&gt;{ &amp;nbsp; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (!enumtor.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return builder;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return builder.AppendOneOrMore(enumtor.Current, enumtor);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;private static StringBuilder AppendOneOrMore(this StringBuilder builder, string first, IEnumerator&amp;lt;string&amp;gt; enumtor)&lt;/p&gt;
&lt;p&gt;{ &amp;nbsp; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (!enumtor.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return builder.Append(first);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return builder.AppendTwoOrMore(first, enumtor.Current, enumtor);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;private static StringBuilder AppendTwoOrMore(this StringBuilder builder, string first, string second, IEnumerator&amp;lt;string&amp;gt; enumtor)&lt;/p&gt;
&lt;p&gt;{ &amp;nbsp; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;while (enumtor.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{ &amp;nbsp; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder = builder.Append(first).Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;first = second;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;second = enumtor.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return builder.Append(first).Append(&amp;quot; and &amp;quot;).Append(second);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9563180</link><pubDate>Thu, 23 Apr 2009 00:02:54 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9563180</guid><dc:creator>Mark Knell</dc:creator><description>&lt;P&gt;Olivier's arguments in favor of terseness would be more persuasive if his code worked. &amp;nbsp;It has a bug for the case of inputs sequences of length 2. &amp;nbsp;&lt;/P&gt;
&lt;P&gt;@Dave "More lines equals more bugs": Except when too few lines equals more bugs. &amp;nbsp;Cf bathtub curve.&lt;/P&gt;
&lt;DIV class=yellowbox&gt;
&lt;P&gt;I'm not seeing the bug. I tried compiling and running the code on a few cases and it worked fine. What's the repro you have in mind? -- Eric&lt;/P&gt;&lt;/DIV&gt;</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9563947</link><pubDate>Thu, 23 Apr 2009 07:21:28 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9563947</guid><dc:creator>Antonio Fontan</dc:creator><description>&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string JoinWords(IEnumerable&amp;lt;string&amp;gt; words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string wordList = String.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int count = words.Count();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch (count)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 0:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 1:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;wordList = words.First();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;wordList = string.Join(&amp;quot;, &amp;quot;, words.Take(count - 1).ToArray()) + &amp;quot; and &amp;quot; + words.Last();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + wordList + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9564047</link><pubDate>Thu, 23 Apr 2009 08:47:33 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9564047</guid><dc:creator>Antonio Fontan</dc:creator><description>&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; static string JoinWords(IEnumerable&amp;lt;string&amp;gt; words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var wordList = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string lastWord = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string andSeparator = String.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string commaSeparator = String.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string str in words)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lastWord != null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;wordList.Append(commaSeparator);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;wordList.Append(lastWord);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;andSeparator = &amp;quot; and &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;commaSeparator = &amp;quot;, &amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;lastWord = str;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + wordList.ToString() + andSeparator + (lastWord ?? String.Empty) + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9564085</link><pubDate>Thu, 23 Apr 2009 09:13:18 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9564085</guid><dc:creator>Mark Knell</dc:creator><description>&lt;p&gt;Uh oh. &amp;nbsp;The bug was not in Olivier's code but in my misreading of the spec, and thus my test suite. &amp;nbsp;Somehow I thought &amp;quot;and&amp;quot; was not supposed to materialize until the list contained 3+ items. &amp;nbsp;No clue where I got that from.&lt;/p&gt;
&lt;p&gt;Olivier--I don't know if you'd consider terseness as much of a virtue in apologies as in code, but if so: MY BAD.&lt;/p&gt;
&lt;p&gt;Eric--thanks for treating my post with less mischief than it had initiated or, for that matter, deserved. This is a first class blog and can reasonably be assumed to have a first class audience; I should have n-tuple checked my math before bringing the snark.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9565567</link><pubDate>Fri, 24 Apr 2009 01:11:58 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9565567</guid><dc:creator>ErikF</dc:creator><description>&lt;p&gt;If I had a lot of lookaheads in my program, I would probably make an enumerator that let me do that. &amp;nbsp;I added an unchecked Current and Lookahead for routines that don't need the documented IEnumerator behaviour. &amp;nbsp;This is probably not the most efficient implementation, but it worked OK for this application.&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Collections;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;/// LookaheadEnumerator: Provides an enumerator that allows a program to &amp;quot;peek&amp;quot; into the next element&lt;/p&gt;
&lt;p&gt;public sealed class LookaheadEnumerator&amp;lt;T&amp;gt;: IEnumerator&amp;lt;T&amp;gt;, System.Collections.IEnumerator {&lt;/p&gt;
&lt;p&gt; &amp;nbsp;private IEnumerator&amp;lt;T&amp;gt; m_enum;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;private bool m_hasNext;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;private bool m_pastBounds;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;private bool m_atStart;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;private T m_current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;private T m_lookahead;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public LookaheadEnumerator(IEnumerator&amp;lt;T&amp;gt; e) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;m_enum = e;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Init();&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public void Reset() {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;m_enum.Reset();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Init();&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;private void Init() {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;m_atStart = m_pastBounds = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;m_hasNext = m_enum.MoveNext();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;m_current = default(T);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;m_lookahead = (m_hasNext) ? m_enum.Current : default(T);&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public bool MoveNext() {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;m_current = m_lookahead;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if(m_hasNext) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;m_hasNext = m_enum.MoveNext();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;m_atStart = m_pastBounds = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;m_lookahead = (m_hasNext) ? m_enum.Current : default(T);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;} else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;// No more elements exist&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;m_pastBounds = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return !m_pastBounds;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;// Emulate the behaviour of the passed-in enumerator&lt;/p&gt;
&lt;p&gt; &amp;nbsp;object System.Collections.IEnumerator.Current {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;get {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!m_pastBounds) return m_current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;else {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(m_atStart) m_enum.Reset();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return m_enum.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public T Current {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;get {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!m_pastBounds) return m_current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;else {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(m_atStart) m_enum.Reset();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return m_enum.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;// Get the next element with bounds checking&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public T Lookahead {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;get {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(m_hasNext) return m_lookahead;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;else {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(m_atStart) m_enum.Reset();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return m_enum.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;// Get the last valid element (if any): don't do any bounds checking&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public T UncheckedCurrent { get { return m_current; } }&lt;/p&gt;
&lt;p&gt; &amp;nbsp;// Get the next valid element (if any): don't do any bounds checking&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public T UncheckedLookahead { get { return m_lookahead; } }&lt;/p&gt;
&lt;p&gt; &amp;nbsp;// Indicate whether the lookahead is valid&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public bool LookaheadAtEnd { get { return !m_hasNext; } }&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public void Dispose() { m_enum.Dispose(); }&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;public class TestComma {&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public static void Main(string[] args) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;string[][] cases = new string[][] {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;new string[] { },&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;new string[] { &amp;quot;ABC&amp;quot; },&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; },&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot; },&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;foreach(string[] s in cases)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(CommaJoin(s));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;const int numElems = 4000;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;var sl = new List&amp;lt;string&amp;gt;(numElems);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;for(int i = 0; i &amp;lt; numElems; ++i) sl.Add(i.ToString());&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;var sw = new System.Diagnostics.Stopwatch();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;sw.Start();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;for(int j = 0; j &amp;lt; numElems; ++j) CommaJoin(sl);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;sw.Stop();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Console.WriteLine(&amp;quot;{0} iterations of {0} elements in {1} (average: {2}/iteration)&amp;quot;,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;numElems.ToString(), sw.Elapsed, new TimeSpan(sw.Elapsed.Ticks/numElems));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return;&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp;public static string CommaJoin(IEnumerable&amp;lt;string&amp;gt; s) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;using(var le = new LookaheadEnumerator&amp;lt;string&amp;gt;(s.GetEnumerator())) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(le.MoveNext()) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(le.UncheckedCurrent);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while(le.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append((le.LookaheadAtEnd) ? &amp;quot; and &amp;quot; : &amp;quot;, &amp;quot;).Append(le.UncheckedCurrent);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return sb.Append(&amp;quot;}&amp;quot;).ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9567914</link><pubDate>Sat, 25 Apr 2009 11:57:32 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9567914</guid><dc:creator>marc.gravell</dc:creator><description>&lt;p&gt;I've dropped my answer here; no back-tracking - purely additive: &lt;a rel="nofollow" target="_new" href="http://stackoverflow.com/questions/788535/eric-lipperts-challenge-comma-quibbling-best-answer/788561#788561"&gt;http://stackoverflow.com/questions/788535/eric-lipperts-challenge-comma-quibbling-best-answer/788561#788561&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9567983</link><pubDate>Sat, 25 Apr 2009 13:38:13 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9567983</guid><dc:creator>Drew Noakes</dc:creator><description>&lt;p&gt;Thank you for this interesting question, Eric.&lt;/p&gt;
&lt;p&gt;A variant that continues with the general theme of processing streams would be to consider the output string as a stream of characters and therefore implement a method:&lt;/p&gt;
&lt;p&gt;IEnumerable&amp;lt;char&amp;gt; GetCommaQuibbledStringCharacters(IEnumerable&amp;lt;string&amp;gt; inputStrings);&lt;/p&gt;
&lt;p&gt;This could be optimised for both space and time efficiency in interesting ways.&lt;/p&gt;
&lt;p&gt;As an aside, I think this kind of Q&amp;amp;A would be well suited to &lt;a rel="nofollow" target="_new" href="http://www.stackoverflow.com"&gt;http://www.stackoverflow.com&lt;/a&gt;, where:&lt;/p&gt;
&lt;p&gt;GetCommaQuibbledStringCharacters(new[] {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;people can refine their answers in-place (avoiding repeat postings)&amp;quot;,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;the code is automatically formatted and highlighted for you&amp;quot;,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;posts can be freely commented upon by everyone&amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;};&lt;/p&gt;
&lt;p&gt;Would you consider posting these sorts of puzzles there? &amp;nbsp;This blog post has certainly proved to be inspiring to many people but the nature of a blog is such that it is better suited to the broadcast of thoughts and information rather than community involvement and open discussion.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9570799</link><pubDate>Mon, 27 Apr 2009 14:11:25 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9570799</guid><dc:creator>Luke Hughes</dc:creator><description>&lt;p&gt;This version only needs a single pass through the collection, so performance should be pretty good. It uses the standard &amp;quot;foreach&amp;quot; statement rather than accessing the enumerator directly.&lt;/p&gt;
&lt;p&gt;Comments, tests etc omitted for brevity: I'm hoping that the code will speak for itself ;)&lt;/p&gt;
&lt;p&gt;public static string CommaQuibbling(IEnumerable&amp;lt;string&amp;gt; items)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Action&amp;lt;StringBuilder, string, string&amp;gt; append = (sb, delim, value) =&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (value != null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (sb.Length &amp;gt; 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(delim);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(value);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;StringBuilder builder = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;string lastItem = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;foreach (string item in items)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;append(builder, &amp;quot;, &amp;quot;, lastItem);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;lastItem = item;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;append(builder, &amp;quot; and &amp;quot;, lastItem);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return builder.Append(&amp;quot;}&amp;quot;).ToString();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Also posted to StackOverflow: &lt;a rel="nofollow" target="_new" href="http://stackoverflow.com/questions/788535/eric-lipperts-challenge-comma-quibbling-best-answer/790151#790151"&gt;http://stackoverflow.com/questions/788535/eric-lipperts-challenge-comma-quibbling-best-answer/790151#790151&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9570879</link><pubDate>Mon, 27 Apr 2009 15:59:17 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9570879</guid><dc:creator>Luke Hughes</dc:creator><description>&lt;p&gt;Oops. My previous answer didn't correctly handle any empty strings appearing at the beginning of the collection. Here's the fixed version:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public static string CommaQuibbling(IEnumerable&amp;lt;string&amp;gt; items)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder builder = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string lastItem = null;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bool itemsAppended = false;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Action&amp;lt;string, string&amp;gt; append = (delimiter, value) =&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (value != null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (itemsAppended)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(delimiter);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.Append(value);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;itemsAppended = true;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string item in items)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;append(&amp;quot;, &amp;quot;, lastItem);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;lastItem = item;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;append(&amp;quot; and &amp;quot;, lastItem);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return builder.Append(&amp;quot;}&amp;quot;).ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;Also posted to StackOverflow: &lt;a rel="nofollow" target="_new" href="http://stackoverflow.com/questions/788535/eric-lipperts-challenge-comma-quibbling-best-answer/790065#790065"&gt;http://stackoverflow.com/questions/788535/eric-lipperts-challenge-comma-quibbling-best-answer/790065#790065&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9571810</link><pubDate>Mon, 27 Apr 2009 22:43:32 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9571810</guid><dc:creator>Grant Husbands</dc:creator><description>&lt;p&gt;It's quite possible to write a solution using a single foreach with just a bool and a string as extra state. It's fairly readable, imho:&lt;/p&gt;
&lt;p&gt;public static string CommaQuibbling(IEnumerable&amp;lt;string&amp;gt; items)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&amp;#160; StringBuilder sb = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt;&amp;#160; bool empty = true;&lt;/p&gt;
&lt;p&gt;&amp;#160; string prev = null;&lt;/p&gt;
&lt;p&gt;&amp;#160; foreach (string s in items)&lt;/p&gt;
&lt;p&gt;&amp;#160; {&lt;/p&gt;
&lt;p&gt;&amp;#160; &amp;#160; if (prev!=null)&lt;/p&gt;
&lt;p&gt;&amp;#160; &amp;#160; {&lt;/p&gt;
&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; if (!empty) sb.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; else empty = false;&lt;/p&gt;
&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; sb.Append(prev);&lt;/p&gt;
&lt;p&gt;&amp;#160; &amp;#160; }&lt;/p&gt;
&lt;p&gt;&amp;#160; &amp;#160; prev = s;&lt;/p&gt;
&lt;p&gt;&amp;#160; }&lt;/p&gt;
&lt;p&gt;&amp;#160; if (prev!=null)&lt;/p&gt;
&lt;p&gt;&amp;#160; {&lt;/p&gt;
&lt;p&gt;&amp;#160; &amp;#160; if (!empty) sb.Append(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt;&amp;#160; &amp;#160; sb.Append(prev);&lt;/p&gt;
&lt;p&gt;&amp;#160; }&lt;/p&gt;
&lt;p&gt;&amp;#160; return sb.Append('}').ToString();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Looking at the other solutions, Andrey Titov's is similar, but uses an extra enumerator. Jon Skeet's is also similar, but uses two strings. Also posted to StackOverflow, at &lt;a rel="nofollow" target="_new" href="http://stackoverflow.com/questions/788535/eric-lipperts-challenge-comma-quibbling-best-answer/#794905"&gt;http://stackoverflow.com/questions/788535/eric-lipperts-challenge-comma-quibbling-best-answer/#794905&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(I don't know how to post code in comments here and there's no preview, so I apologise if the above is messy)&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9573412</link><pubDate>Tue, 28 Apr 2009 14:13:16 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9573412</guid><dc:creator>Frank Bakker</dc:creator><description>&lt;p&gt;After spending a tol of time coming up with the 'best' solution I decided that my first correct solution (proven by the Unit Tests) was the best one. &lt;/p&gt;
&lt;p&gt;This is assuming development efford is the most expensive resource. Unfortnately I no longer have my initial solution to show you because I wasted my time 'improving' it to look like some of the other posts above. I do still have my original UnitTest, meybe they will help you.&lt;/p&gt;
&lt;p&gt;using CommaSeparate;&lt;/p&gt;
&lt;p&gt;using Microsoft.VisualStudio.TestTools.UnitTesting;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;namespace CommaSeparate.Test&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;///This is a test class for Class1Test and is intended&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;///to contain all Class1Test Unit Tests&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;///&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;[TestClass()]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;public class Class1Test&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;///A test for Seperate&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;///&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[TestMethod()]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void Empty()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Test(new string[]{}, @&amp;quot;{}&amp;quot;); &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[TestMethod()]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void Count1()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Test(new []{&amp;quot;ABC&amp;quot;}, @&amp;quot;{ABC}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[TestMethod()]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void Count2()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Test(new[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; }, @&amp;quot;{ABC AND DEF}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[TestMethod()]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void Count3()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Test(new[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;GHI&amp;quot; }, @&amp;quot;{ABC, DEF AND GHI}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[TestMethod()]&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void Count4()&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Test(new[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;GHI&amp;quot;, &amp;quot;JKL&amp;quot;}, @&amp;quot;{ABC, DEF, GHI AND JKL}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void Test(IEnumerable&amp;lt;string&amp;gt; input, string expectedResult)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string actual;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;actual = Class1.Seperate(input);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.AreEqual(expectedResult, actual);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9573510</link><pubDate>Tue, 28 Apr 2009 15:38:22 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9573510</guid><dc:creator>Chandra</dc:creator><description>&lt;p&gt;static string method(IEnumerable&amp;lt;string&amp;gt; stringEnumeration)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (stringEnumeration.Count() == 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if (stringEnumeration.Count() == 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(stringEnumeration.ElementAt(0));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int i = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (;i &amp;lt; stringEnumeration.Count()-2; i++)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(stringEnumeration.ElementAt(i)+&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(stringEnumeration.ElementAt(i)+&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(stringEnumeration.ElementAt(i + 1));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sb.Append(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string s = sb.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return s;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9581870</link><pubDate>Fri, 01 May 2009 07:46:28 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9581870</guid><dc:creator>Branco Medeiros</dc:creator><description>&lt;p&gt;Code is Vb.net. &lt;/p&gt;
&lt;p&gt;Solution 1 -- A generic state machine:&lt;/p&gt;
&lt;p&gt; &amp;nbsp;Class ListBuilder(Of T)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Private mSb As New System.Text.StringBuilder(&amp;quot;{&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Private mP As T&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Private mState As Integer&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Public Sub Append(S As T)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;Select Case mState&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Case 0: &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mSb.Append(S)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mState = 1&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Case 1:&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mP = S&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mState = 2&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Case 2&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mSb.Append(&amp;quot;, &amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mSb.Append(mP)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mP = S&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Select&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;End Sub&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Overrides Function ToString As String&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;If mState &amp;gt; 1 Then&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mSb.Append(&amp;quot; and &amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mSb.Append(mP)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;mSb.Append(&amp;quot;}&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return mSb.ToString &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;End Function&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Shared Function MakeList(List As IEnumerable(Of T)) As String&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim Lm As New ListBuilder(Of T)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;If List IsNot Nothing Then&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For Each S As T In List&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lm.Append(S)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Next&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;Return Lm.ToString &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;End Function&lt;/p&gt;
&lt;p&gt; &amp;nbsp;End Class&lt;/p&gt;
&lt;p&gt; &amp;nbsp;'***&lt;/p&gt;
&lt;p&gt; &amp;nbsp;'Tests in the immediate window:&lt;/p&gt;
&lt;p&gt; &amp;nbsp;? ListBuilder(Of Char).MakeList(&amp;quot;&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;? ListBuilder(Of Char).MakeList(&amp;quot;a&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;? ListBuilder(Of Char).MakeList(&amp;quot;ab&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;? ListBuilder(Of Char).MakeList(&amp;quot;abc&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;? ListBuilder(Of Char).MakeList(&amp;quot;abcd&amp;quot;)&lt;/p&gt;
&lt;p&gt;Solution 2 -- a generic &amp;quot;bufferized&amp;quot; loop:&lt;/p&gt;
&lt;p&gt; &amp;nbsp;Function MakeList(Of T)(List As IEnumerable(Of T)) As String&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Dim S As New System.Text.StringBuilder &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;S.Append(&amp;quot;{&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;If List IsNot Nothing Then&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;Using E As IEnumerator(Of T) = List.GetEnumerator &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If E.MoveNext Then&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;S.Append(E.Current)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;If E.MoveNext Then&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Dim P As T = E.Current&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Do While E.MoveNext&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;S.Append(&amp;quot;,&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;S.Append(P)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;P = E.Current &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Loop&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;S.Append(&amp;quot; and &amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;S.Append(P)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End if&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;End If&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;End Using&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;End if&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;S.Append(&amp;quot;}&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;Return S.ToString &lt;/p&gt;
&lt;p&gt; &amp;nbsp;End Function&lt;/p&gt;
&lt;p&gt; &amp;nbsp;'***&lt;/p&gt;
&lt;p&gt; &amp;nbsp;'Tests in the immediate window:&lt;/p&gt;
&lt;p&gt; &amp;nbsp;? MakeList(&amp;quot;&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;? MakeList(&amp;quot;a&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;? MakeList(&amp;quot;ab&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;? MakeList(&amp;quot;abc&amp;quot;)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;? MakeList(&amp;quot;abcd&amp;quot;)&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9592888</link><pubDate>Thu, 07 May 2009 08:38:54 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9592888</guid><dc:creator>aaron</dc:creator><description>&lt;p&gt;I'm not sure how, but neither Scheme nor any other Lisp has been mentioned. &amp;nbsp;Haskell made an appearance, so clearly there are _some_ functional programmers here.&lt;/p&gt;
&lt;p&gt;This is similar to David and Claudiu's solutions, but I thought I should still mention it for language-list completeness:&lt;/p&gt;
&lt;p&gt;(define (oxford-list-join word-sequence)&lt;/p&gt;
&lt;p&gt; &amp;nbsp;(let oxford* ((word-sequence word-sequence)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(accum &amp;quot;{&amp;quot;))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;(cond &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;((null? word-sequence) &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; (string-append accum &amp;quot;}&amp;quot;))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;((null? (cdr word-sequence))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; last word gets nothing&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; (oxford* '() (string-append accum (car word-sequence))))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;((null? (cddr word-sequence))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;; second to last word postfix with &amp;quot; and &amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; (oxford* (cdr word-sequence)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(string-append accum (car word-sequence) &amp;quot; and &amp;quot;)))&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;(else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;;; all others join with &amp;quot;, &amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(oxford* (cdr word-sequence)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (string-append accum (car word-sequence) &amp;quot;, &amp;quot;))))))&lt;/p&gt;
&lt;p&gt;Sample input:&lt;/p&gt;
&lt;p&gt; &amp;nbsp;(oxford-list-join '(&amp;quot;first&amp;quot; &amp;quot;second&amp;quot; &amp;quot;third&amp;quot; &amp;quot;fouth&amp;quot;))&lt;/p&gt;
&lt;p&gt;Ran on Chicken Scheme, SISC, Petite Chez Scheme, and MzScheme. &amp;nbsp;If you don't have Scheme, you can use the SISC interpreter online at &lt;a rel="nofollow" target="_new" href="http://sisc-scheme.org/sisc-online.php"&gt;http://sisc-scheme.org/sisc-online.php&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9608321</link><pubDate>Wed, 13 May 2009 01:24:55 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9608321</guid><dc:creator>Joe Rattz</dc:creator><description>&lt;p&gt;It looks like I have arrived late to the party. &amp;nbsp;This one is not very efficient, but it was fun to write. &amp;nbsp;Plus, I expect extra credit for combining this solution with another of your blog posts!&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//string[] input = {};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//string[] input = { &amp;quot;ABC&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//string[] input = { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string[] input = { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var output = BuildStringSpecial(input);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Console.WriteLine(output);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string BuildStringSpecial(IEnumerable&amp;lt;string&amp;gt; input)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int count = input.Count();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (count == 0) return &amp;quot;{}&amp;quot;;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Stack&amp;lt;string&amp;gt; seps = new Stack&amp;lt;string&amp;gt;();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;seps.Push(&amp;quot;}&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (count &amp;gt; 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;seps.Push(&amp;quot; and &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (count &amp;gt; 2)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (count &amp;gt; 2) { seps.Push(&amp;quot;, &amp;quot;); count--; }&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder body = new StringBuilder(&amp;quot;{&amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;input.Zip(seps, (i, s) =&amp;gt; { body.Append(i); body.Append(s); return &amp;quot;&amp;quot;; }).ToArray();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return body.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;Not much code. &amp;nbsp;Not very efficient either, but it demonstrates your Zip operator nicely!&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9616298</link><pubDate>Thu, 14 May 2009 18:24:46 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9616298</guid><dc:creator>Leo Bushkin</dc:creator><description>&lt;p&gt;Although it's arguable whether this is the clearest way to write such a function, since I didn't see anyone submit the one-line version, here it is:&lt;/p&gt;
&lt;p&gt;public static string Concat(IEnumerable&amp;lt;string&amp;gt; list)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return string.Format( &amp;quot;{{{0}}}&amp;quot;,&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string.Join( &amp;quot;, &amp;quot;, list.Take( list.Count() &amp;gt; 1 ? list.Count() - 1 : 1 ).ToArray() ) +&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;( list.Count() &amp;gt; 1 ? &amp;quot; and &amp;quot; + list.Last() : &amp;quot;&amp;quot; ) );&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9616313</link><pubDate>Thu, 14 May 2009 18:32:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9616313</guid><dc:creator>Leopold Bushkin</dc:creator><description>&lt;p&gt;ALthough this doesn't perfectly satisfy the requirements because it doesn't wrap the result in { }, here's the tail recursive version:&lt;/p&gt;
&lt;p&gt;public static string Concat( IEnumerable&amp;lt;string&amp;gt; list )&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (list.Count() == 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return string.Empty;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (list.Count() == 1)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return list.First();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return list.First() +&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (list.Count() &amp;gt; 2 ? &amp;quot;, &amp;quot; : &amp;quot; and &amp;quot;) +&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Concat( list.Skip( 1 ) );&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9635609</link><pubDate>Fri, 22 May 2009 20:55:42 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9635609</guid><dc:creator>Aaron Eshbach</dc:creator><description>&lt;p&gt;I went for one that's good with very large sets. &amp;nbsp;This takes &amp;lt;40ms for 1000 strings and &amp;lt;400ms for 1,000,000 strings on my aging Pentium 4 workstation. &amp;nbsp;(I have e-mailed this solution since I'm so late submitting, so Eric, you may skip this post). &amp;nbsp;If you changed the return type to char[] I think this would even work beyond the limits of the String class.&lt;/p&gt;
&lt;p&gt;static string CreateLippertString(IEnumerable&amp;lt;string&amp;gt; strings)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;char[] combinedString;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;char[] commaSeparator = new char[] { ',', ' ' };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;char[] andSeparator = new char[] { ' ', 'A', 'N', 'D', ' ' };&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int totalLength = 2; &amp;nbsp;//'{' and '}'&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int numEntries = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int currentEntry = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int currentPosition = 0;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int secondToLast;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int last;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int cbComma = 2 * sizeof(char);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;int cbAnd = 5 * sizeof(char);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;//calculate the sum of the lengths of the strings&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;foreach (string s in strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;totalLength += s.Length;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;++numEntries;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;//add to the total length the length of the constant characters&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (numEntries &amp;gt;= 2)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;totalLength += 5; &amp;nbsp;// &amp;quot; AND &amp;quot;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (numEntries &amp;gt; 2)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;totalLength += (2 * (numEntries - 2)); // &amp;quot;, &amp;quot; between items&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;//setup some meta-variables to help later&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;secondToLast = numEntries - 2;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;last = numEntries - 1;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;//allocate the memory for the combined string&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;combinedString = new char[totalLength];&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;//set the first character to {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;combinedString[0] = '{';&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;currentPosition = 1;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (numEntries &amp;gt; 0)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//now copy each string into its place&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (string s in strings)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Buffer.BlockCopy(s.ToCharArray(), 0, combinedString, currentPosition * sizeof(char), s.Length * sizeof(char));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;currentPosition += s.Length;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (currentEntry == secondToLast)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Buffer.BlockCopy(andSeparator, 0, combinedString, currentPosition * sizeof(char), cbAnd);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;currentPosition += 5;//andSeparator.Length;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if (currentEntry == last)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;combinedString[currentPosition] = '}'; //set the last character to '}'&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break; &amp;nbsp;//don't bother making that last call to the enumerator&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if (currentEntry &amp;lt; secondToLast)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Buffer.BlockCopy(commaSeparator, 0, combinedString, currentPosition * sizeof(char), cbComma);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;currentPosition += 2;//commaSeparator.Length;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;++currentEntry;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//set the last character to '}'&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;combinedString[1] = '}';&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return new string(combinedString);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9813104</link><pubDate>Thu, 02 Jul 2009 09:06:44 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9813104</guid><dc:creator>vlastimil.adamovsky</dc:creator><description>&lt;p&gt;Eric, take a look at my &amp;quot;pretty unmaintainable&amp;quot; solution :)) Anybody is free to use it for fun and for making money ..&lt;/p&gt;
&lt;p&gt; &amp;nbsp;static string &amp;nbsp;buildString(IEnumerable&amp;lt;string&amp;gt; mlist)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var count = mlist.Count();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var res = mlist.Select((mitem, index) =&amp;gt; new { str = mitem + ((count - 1) == index ? &amp;quot;&amp;quot; : ( (count - 2) == index ? &amp;quot; and &amp;quot; : &amp;quot;,&amp;quot; )) });&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return res.Aggregate(new StringBuilder(&amp;quot;{&amp;quot;), (builder, pitem) =&amp;gt; builder.Append(pitem.str)).Append(&amp;quot;}&amp;quot;).ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9813123</link><pubDate>Thu, 02 Jul 2009 09:16:31 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9813123</guid><dc:creator>vlastimil.adamovsky</dc:creator><description>&lt;p&gt;Eric, &lt;/p&gt;
&lt;p&gt;can you make my contribution above readable? &lt;/p&gt;
&lt;p&gt;One way to see it, is select the text, copy it and past to a notepad...Then you will see the beauty of it .....&lt;/p&gt;
&lt;p&gt;Here is a complete code to test the creation above:&lt;/p&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Linq;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;namespace ErikLipertCHallenge&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;class Program&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//here we test&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static void Main(string[] args)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{ &amp;nbsp; &lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var stringList = new string[][] { new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot;, &amp;quot;G&amp;quot;, &amp;quot;H&amp;quot; },&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new string[] { &amp;quot;ABC&amp;quot;, &amp;quot;DEF&amp;quot; },&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new string[] { &amp;quot;ABC&amp;quot; },&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new string[] {}};&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;foreach (var mArray in stringList)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.Console.WriteLine(buildString(mArray));&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//actual implementation&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;static string &amp;nbsp;buildString(IEnumerable&amp;lt;string&amp;gt; mlist)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var count = mlist.Count();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var res = mlist.Select((mitem, index) =&amp;gt; new { str = mitem + ((count - 1) == index ? &amp;quot;&amp;quot; : ( (count - 2) == index ? &amp;quot; and &amp;quot; : &amp;quot;,&amp;quot; )) });&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return res.Aggregate(new StringBuilder(&amp;quot;{&amp;quot;), (builder, pitem) =&amp;gt; builder.Append(pitem.str)).Append(&amp;quot;}&amp;quot;).ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9913389</link><pubDate>Tue, 27 Oct 2009 08:42:12 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9913389</guid><dc:creator>Niels Teglsbo</dc:creator><description>&lt;p&gt;I'm surprised to see that I'm the first one to use SelectMany:&lt;/p&gt;
&lt;p&gt;public static string Format(IEnumerable&amp;lt;string&amp;gt; list) {&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;var formatElements = list.Reverse().SelectMany((s, i) =&amp;gt; new List&amp;lt;string&amp;gt; { s, i==0 ? &amp;quot; and &amp;quot; : &amp;quot;, &amp;quot; }).Reverse().Skip(1);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;StringBuilder sb = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;foreach (string fs in formatElements) sb.Append(fs);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;return &amp;quot;{&amp;quot; + sb + &amp;quot;}&amp;quot;;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;The idea is that it's easy to remove an extra delimiter if it's an item of its own.&lt;/p&gt;
&lt;p&gt;If the input is [A, B, C], then the list SelectMany produces, will be: {C, &amp;quot; and &amp;quot;, B, &amp;quot;, &amp;quot;, A, &amp;quot;, &amp;quot;}, Reverse and Skip will then reorder the list correctly and remove the extra last element, which is &amp;quot;, &amp;quot; in this example.&lt;/p&gt;
&lt;p&gt;I won't claim that this code is friendly to the code maintainer or would perform very well. In production code I would go with the enumerator.MoveNext() approach.&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9932243</link><pubDate>Thu, 03 Dec 2009 22:25:44 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9932243</guid><dc:creator>GRico</dc:creator><description>&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string Quibble(IEnumerable&amp;lt;string&amp;gt; quibbles)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder b = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.Append('{');&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IEnumerator&amp;lt;string&amp;gt; quibbleMe = quibbles.GetEnumerator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bool atLeastOneQuibbly = quibbleMe.MoveNext();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (atLeastOneQuibbly)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.Append(quibbleMe.Current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (quibbleMe.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string s = quibbleMe.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!quibbleMe.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.Append(&amp;quot; AND &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.Append(s);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.Append(',');&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.Append(s);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.Append(',');&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.Append('}');&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return b.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item><item><title>re: Comma Quibbling</title><link>http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx#9932746</link><pubDate>Fri, 04 Dec 2009 20:03:42 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9932746</guid><dc:creator>GRico</dc:creator><description>&lt;p&gt;Sorry about that last post....I had a brain f..., it obviously does not work. Following one should do the trick. Simple and easy IMHO.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public static string CommaQuibble(IEnumerable&amp;lt;string&amp;gt; quibbleMe)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder commaQuibbled = new StringBuilder();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IEnumerator&amp;lt;string&amp;gt; quibblies = quibbleMe.GetEnumerator();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;commaQuibbled.Append('{');&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;quibblies.MoveNext();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (quibblies.Current != null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;commaQuibbled.Append(quibblies.Current);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;quibblies.MoveNext();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (quibblies.Current != null)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string nextQuibbly = quibblies.Current;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (quibblies.MoveNext())&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;commaQuibbled.Append(&amp;quot;, &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;commaQuibbled.Append(&amp;quot; AND &amp;quot;);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;commaQuibbled.Append(nextQuibbly);&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;commaQuibbled.Append('}');&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return commaQuibbled.ToString();&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;
</description></item></channel></rss>