Home > DeveloperSection > Forums > How can I divide a set of strings into their constituent characters in C#?
jacob rasel
jacob rasel

Total Post:88

Points:616
Posted on    June-06-2013 3:10 AM

 C# C# 
Ratings:


 1 Reply(s)
 1118  View(s)
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. 


AVADHESH PATEL

Total Post:604

Points:4228
Posted on    June-06-2013 8:31 AM

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.

Don't want to miss updates? Please click the below button!

Follow MindStick