在C#中,如何将一组字符串划分为它们的组成字符?
将字符串数组在C#中,如何将一组字符串划分为它们的组成字符?,c#,string,algorithm,C#,String,Algorithm,将字符串数组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++) {
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++;
}
}
int characterCount=0;
对于(int i=0;i
嗯,最简单的方法是:
char[] chrArr = string.Join(string.Empty, strArr).ToCharArray();
为了确保这里的性能特征没有混淆,这里有一个简短的测试程序(不要忘记在右下角打开优化):
(关于性能度量代码的常见警告适用于此处,指出我犯的任何错误)我会:
char[] chrArr = strArr.SelectMany(s => s).ToArray();
基于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);
这基本上是Jesse Slicer答案的扩展 简单地用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的foreach
只是填充一个数组,已经有了一个LINQ方法ToArray
。那么characterCount
和indexCount
就完全没有必要了
var chrArr = strArr.SelectMany(t => t).ToArray();
试试这个
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();
字符串值=”;
字符串[]strArr={“123”、“456”、“789”}//你的字符串数组。
对于(int i=0;我不敢相信这个答案得到2票赞成票,而愚蠢的一票得到14票。@I4V什么?你是什么意思?更短并不意味着更好,就最小化时间而言,我认为你实际上应该做一些性能测量,以确保这句话是正确的:)@LasseV.Karlsen哈,是的,你在测量方面没有错。:)反省一下,我希望string Join()更快,但占用更多内存。这里的“正确”没有多大意义,因为问题中的示例代码是为这个特定问题设计的,LINQ方法当然有优点,尽管我会尽可能使用string.Join
方法,这段代码甚至可能不是一个瓶颈,因此如果LINQ方式对其他开发人员更具可读性,对每个开发人员都更具可读性。我不想说LINQ方法是错误的,但了解很多非LINQy框架代码确实是值得的,仅仅因为LINQ是“新浪潮”,并不意味着所有的旧代码都是坏的、慢的或错误的。尽管如此,我还是喜欢LINQ的例子:)@EdPlunkett我能问一下为什么没有必要使用ToCharArray
。你说得对,我错过了。我喜欢它是因为SelectMany(),我更喜欢它而不是其他SelectMany(),因为“var”而不是char[]。请定义“适当”。一个简单的性能测试表明,我的行的排名比SelectMany行高出8倍。因为两者似乎都没有比另一个更好的具体好处(比如处理EdgeCase或其他更好的东西),如果可以的话,我会选择更快的。就我个人而言,我觉得它们在可读性方面也没有太大的不同我并不是说你错了,我只是说使用LINQ“似乎”更直观(或更惯用)。不过,请随意不同意。是的,字符串及其字符串方法确实得到了高度优化+1用于讨论中的性能测量和合理评论section@TimothyShields“直观”和“适当”都是主观的。LINQSelectMany让我查看文档以了解它,LINQ让我重读了几遍,因为非描述性变量名,而且多个来自
的语句对我来说有点陌生。另一方面,我马上就明白了。从我的角度来看,如果SelectMany
被命名为“Concat”(存在但…)或“flatte”,Linq会更直观。
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++;
}
var chrArr = strArr.SelectMany(t => t).ToArray();
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();