HOW CAN I DIVIDE A SET OF STRINGS INTO THEIR CONSTITUENT CHARACTERS IN C#?

jacob rasel

Total Post:88

Points:616
Posted by  jacob rasel
C# 
C#
 1429  View(s)
Ratings:
Rate this:
Hi Expert,

What is the best way to separate the individual characters in an array of strings strArr into an array of those characters charArr, as depicted below?

string[] strArr = { "123", "456", "789" };
char[] chrArr = { '1', '2', '3', '4', '5', '6', '7', '8', '9' };
This is what I am currently doing, but I do not think that it is very elegant:

int characterCount = 0;

for (int i = 0; i < strArr.Length; i++)
{
    characterCount += strArr[i].Length;
}

int indexCount = 0;
char[] chrArr = new char[characterCount];

for (int i = 0; i < strArr.Length; i++)
{
    for (int j = 0; j < strArr[i].Length; j++)
    {
        chrArr[indexCount] = strArr[i][j];
        indexCount++;
    }
}

Please help,
Thanks in advance. 
  1. AVADHESH PATEL

    Post:604

    Points:4228
    Re: How can I divide a set of strings into their constituent characters in C#?

    Hi,


    Well, easiest way would be this:

    char[] chrArr = string.Join(string.Empty, strArr).ToCharArray();
    To make sure there is no confusion over performance characteristics here, here is a short program to test in LINQPad (don't forget to turn on optimizations in the lower right corner):

    static string[] strArr = { "123", "456", "789" };

    void Main()
    {
        const int iterations = 10000000; // 10 million

        // Warm up JITter
        StringJoin();
        LINQSelectMany();
        LINQ();

        Stopwatch sw = Stopwatch.StartNew();
        for (int index = 0; index < iterations; index++)
            StringJoin();
        sw.Stop();
        sw.ElapsedMilliseconds.Dump("String.Join");

        sw.Restart();
        for (int index = 0; index < iterations; index++)
            LINQSelectMany();
        sw.Stop();
        sw.ElapsedMilliseconds.Dump("LINQ SelectMany");

        sw.Restart();
        for (int index = 0; index < iterations; index++)
            LINQ();
        sw.Stop();
        sw.ElapsedMilliseconds.Dump("LINQ");
    }

    public static void StringJoin()
    {
        char[] c = string.Join(string.Empty, strArr).ToCharArray();
    }

    public static void LINQSelectMany()
    {
        char[] c = strArr.SelectMany(s => s).ToArray();
    }

    public static void LINQ()
    {
        var characters = (from s in strArr
                          from c in s
                          select c).ToArray();

    }
    You can download this LINQPad script here if you want to play with it.

    Output (in milliseconds):

    String.Join 
    765 

    LINQ SelectMany 
    5098 

    LINQ 
    5465 

    I hope it helpful for you.

Answer

NEWSLETTER

Enter your email address here always to be updated. We promise not to spam!