Archives for better way (1)
April 16, 2009

Putting a separator between your elements

Often when I’m programming, I’ll need to list a bunch of stuff and put commas between them. Like this:

1,2,3,4,5

Usually, this is what I, and most of my colleagues do:

            List nums = new List();
            for (int i = 0; i < 5; i++)
            {
                nums.Add(i);
            }

            string msg = "";
            bool first = true;
            foreach (int num in nums)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    msg += ",";
                }
                msg += num.ToString();
            }

After reading Eric Lippert's little article about the horrid-seeming problem of commas and lists, I noticed him mentioning the method

String.Join

.

Needless to say, I went and tried it, and found that I could do the equivalent of the above, like this:

            List nums = new List();
            for (int i = 0; i < 5; i++)
            {
                nums.Add(i);
            }
            
            string msg = string.Join(",", nums.Select(x => x.ToString()).ToArray());
            Console.WriteLine(msg);

Its kinda amazing how after coding in C# for a good year now that I haven't noticed the existence of such a method.

Okay, the lambda expression seems a bit messy with all the parens and all, but you get the idea. Still, its a lot better than writing a loop and having the evil "first" variable which kinda clutters the whole thing. Does anyone know an even better way of doing this?

Update: and for my answer to Eric's next post:

    string msg = "{";
    IEnumerable s = something;

    string[] arr = s.ToArray();

    if (arr.Length > 1)
    {
        string[] ar2 = { 
                   string.Join(", ", arr, 0, arr.Length - 1 ), 
                    arr[arr.Length - 1] 
               };

        msg += string.Join(" and ", ar2);
    }
    else if (arr.Length == 1) msg += arr[0];

    msg += "}";
last comments  
Ryan A
Ryan A

Use a functional language, 1 function takes list, has two cases... it's like 3 lines of code. Something like fun {Join ...
page 1 of 1