Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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++;
    }
}
like image 357
Junior Programmer Avatar asked May 30 '13 20:05

Junior Programmer


People also ask

How do you divide strings?

The split() method splits a string into an array of substrings. The split() method returns the new array. The split() method does not change the original string. If (" ") is used as separator, the string is split between words.

How split a string in C program?

In C, the strtok() function is used to split a string into a series of tokens based on a particular delimiter. A token is a substring extracted from the original string.


Video Answer


2 Answers

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 

(the usual caveat about performance measuring code applies here, point out any mistakes I made)

like image 172
Lasse V. Karlsen Avatar answered Oct 23 '22 22:10

Lasse V. Karlsen


I would do:

char[] chrArr = strArr.SelectMany(s => s).ToArray();
like image 44
Jesse C. Slicer Avatar answered Oct 23 '22 21:10

Jesse C. Slicer