Как я могу разделить набор строк на их составляющие символы в С#?
Каков наилучший способ разделения отдельных символов в массиве строк strArr
на массив этих символов charArr
, как показано ниже?
string[] strArr = { "123", "456", "789" };
char[] chrArr = { '1', '2', '3', '4', '5', '6', '7', '8', '9' };
Это то, что я сейчас делаю, но я не думаю, что он очень изящный:
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++;
}
}
Ответы
Ответ 1
Ну, проще всего было бы:
char[] chrArr = string.Join(string.Empty, strArr).ToCharArray();
Чтобы убедиться, что здесь нет путаницы в характеристиках производительности, вот короткая программа для тестирования в LINQPad (не забудьте включить оптимизацию в нижний правый угол):
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();
}
Вы можете скачать этот LINQPad script здесь, если хотите играть с ним.
Выход (в миллисекундах):
String.Join
765
LINQ SelectMany
5098
LINQ
5465
(здесь применяется обычная оговорка о коде измерения производительности, укажите любые ошибки, которые я сделал)
Ответ 2
Я бы сделал:
char[] chrArr = strArr.SelectMany(s => s).ToArray();
Ответ 3
var res = strArr.SelectMany(c => c.ToCharArray()).ToArray();
Ответ 4
Версия на основе LINQ будет:
var input = new string[] { "abc", "def", "ghi" };
var characters = (from s in input
from c in s
select c).ToArray();
foreach (var c in characters) Console.WriteLine(c);
Ответ 5
Это в основном расширение ответа Джесси Слайсер.
Просто очистите свой код с помощью ReSharper (если у вас нет этого или что-то в этом роде, пойдите его сейчас) дает следующее:
var characterCount = strArr.Sum(t => t.Length);
var indexCount = 0;
var chrArr = new char[characterCount];
foreach (var t1 in strArr.SelectMany(t => t))
{
chrArr[indexCount] = t1;
indexCount++;
}
foreach
просто заполняет массив, и для этого уже существует метод LINQ ToArray
. Тогда characterCount
и indexCount
совершенно не нужны.
var chrArr = strArr.SelectMany(t => t).ToArray();
Ответ 6
попробуйте это.
string value="";
string[] strArr = { "123", "456", "789" }; //Your string array.
for(int i=0;i<strArr.Length;i++)
{
value+=strArr[i];
}
char [] array=value.ToCharArray();