Eric Lippert's challenge “comma-quibbling”, best answer?

后端 未结 27 2189
日久生厌
日久生厌 2020-12-01 06:59

I wanted to bring this challenge to the attention of the stackoverflow community. The original problem and answers are here. BTW, if you did not follow it before, you should

27条回答
  •  情深已故
    2020-12-01 07:11

    Here's mine, but I realize it's pretty much like Marc's, some minor differences in the order of things, and I added unit-tests as well.

    using System;
    using NUnit.Framework;
    using NUnit.Framework.Extensions;
    using System.Collections.Generic;
    using System.Text;
    using NUnit.Framework.SyntaxHelpers;
    
    namespace StringChallengeProject
    {
        [TestFixture]
        public class StringChallenge
        {
            [RowTest]
            [Row(new String[] { }, "{}")]
            [Row(new[] { "ABC" }, "{ABC}")]
            [Row(new[] { "ABC", "DEF" }, "{ABC and DEF}")]
            [Row(new[] { "ABC", "DEF", "G", "H" }, "{ABC, DEF, G and H}")]
            public void Test(String[] input, String expectedOutput)
            {
                Assert.That(FormatString(input), Is.EqualTo(expectedOutput));
            }
    
            //codesnippet:93458590-3182-11de-8c30-0800200c9a66
            public static String FormatString(IEnumerable input)
            {
                if (input == null)
                    return "{}";
    
                using (var iterator = input.GetEnumerator())
                {
                    // Guard-clause for empty source
                    if (!iterator.MoveNext())
                        return "{}";
    
                    // Take care of first value
                    var output = new StringBuilder();
                    output.Append('{').Append(iterator.Current);
    
                    // Grab next
                    if (iterator.MoveNext())
                    {
                        // Grab the next value, but don't process it
                        // we don't know whether to use comma or "and"
                        // until we've grabbed the next after it as well
                        String nextValue = iterator.Current;
                        while (iterator.MoveNext())
                        {
                            output.Append(", ");
                            output.Append(nextValue);
    
                            nextValue = iterator.Current;
                        }
    
                        output.Append(" and ");
                        output.Append(nextValue);
                    }
    
    
                    output.Append('}');
                    return output.ToString();
                }
            }
        }
    }
    

提交回复
热议问题