从字符串到锯齿状的字符数组
From string to jagged array of chars
如果不使用 LINQ,我该如何解决这个问题?
我有一个字符串:string stringContent = "Loremipsumdolorsitamet";
和行的大小(最大列):int arraySize = 5;
然后我必须得到这个结果:
{
{ 'L', 'o', 'r', 'e', 'm' },
{ 'i', 'p', 's', 'u', 'm' },
{ 'd', 'o', 'l', 'o', 'r' },
{ 's', 'i', 't', 'a', 'm' },
{ 'e', 't' }
}
到目前为止我的代码:
static void Main(string[] args)
{
int arraySize = 5;
string stringContent = "Loremipsumdolorsitamet";
int length = stringContent.Length / arraySize;
char[][] save = new char[length + 1][]; // Length + 1 is for the extra lien at the end F.E 'e' 't'
int charIndex = 0; // this is fo
for (int i = 0; i < length; i++)
{
char[] line = new char[arraySize - 1];
int j = 1;
while (j <= arraySize)
{
if (charIndex < stringContent.Length)
{
line[j] = stringContent[charIndex];
charIndex++;
}
j++;
}
save[i] = line;
}
for (int i = 0; i < length; i++)
{
for (int k = 0; k < arraySize; k++)
{
Console.Write(save[i][k]);
}
Console.WriteLine();
}
}
.Net 6,目前可作为候选发布版本使用,但预计现在任何时候都会正式发布,将有 IEnumerable<T>.Chunk()
:
var result = stringContent.Chunk(5);
foreach(char[] segment in result)
{
foreach(char c in segment)
{
Console.Write(c);
}
Console.WriteLine();
}
现在我知道一个未发布的方法可能对您没有帮助,尤其是当您要求不使用 linq 时。但是it's not really linq if you implement the method yourself:
public static IEnumerable<T[]> Chunk<T>(this IEnumerable<T> values, int chunkSize)
{
T[] items = new T[chunkSize];
int i = 0;
var e = values.GetEnumerator();
while (e.MoveNext())
{
items[i] = e.Current;
i++;
if (i == chunkSize) {
yield return items;
items = new T[chunkSize];
i = 0;
}
}
if (i != 0) //partial array remaining
{
T[] final = new T[i];
while (i>0) final[--i] = items[i];
yield return final;
}
}
看到它在这里工作...
... 并注意顶部缺少 using System.Linq;
。
根据要求,没有 LINQ,使用 .Net 的更简单版本 API:
class Program
{
static void Main(string[] args)
{
char[][] result = ToArrays("Loremipsumdolorsitamet", 5);
WriteResult(result, Console.Out);
}
private static char[][] ToArrays(string text, int arraySize)
{
var arrs = new List<char[]>();
while (!string.IsNullOrEmpty(text))
{
int len = Math.Min(arraySize, text.Length);
string chunk = text.Substring(0, len);
text = text.Substring(len);
arrs.Add(chunk.ToCharArray());
}
return arrs.ToArray();
}
private static void WriteResult(char[][] result, TextWriter writer)
{
writer.WriteLine("{");
foreach (char[] arr in result)
{
writer.Write("\t{ '");
writer.Write(string.Join("', '", arr));
writer.WriteLine("' }");
}
writer.WriteLine("}");
}
}
如果不使用 LINQ,我该如何解决这个问题?
我有一个字符串:string stringContent = "Loremipsumdolorsitamet";
和行的大小(最大列):int arraySize = 5;
然后我必须得到这个结果:
{
{ 'L', 'o', 'r', 'e', 'm' },
{ 'i', 'p', 's', 'u', 'm' },
{ 'd', 'o', 'l', 'o', 'r' },
{ 's', 'i', 't', 'a', 'm' },
{ 'e', 't' }
}
到目前为止我的代码:
static void Main(string[] args)
{
int arraySize = 5;
string stringContent = "Loremipsumdolorsitamet";
int length = stringContent.Length / arraySize;
char[][] save = new char[length + 1][]; // Length + 1 is for the extra lien at the end F.E 'e' 't'
int charIndex = 0; // this is fo
for (int i = 0; i < length; i++)
{
char[] line = new char[arraySize - 1];
int j = 1;
while (j <= arraySize)
{
if (charIndex < stringContent.Length)
{
line[j] = stringContent[charIndex];
charIndex++;
}
j++;
}
save[i] = line;
}
for (int i = 0; i < length; i++)
{
for (int k = 0; k < arraySize; k++)
{
Console.Write(save[i][k]);
}
Console.WriteLine();
}
}
.Net 6,目前可作为候选发布版本使用,但预计现在任何时候都会正式发布,将有 IEnumerable<T>.Chunk()
:
var result = stringContent.Chunk(5);
foreach(char[] segment in result)
{
foreach(char c in segment)
{
Console.Write(c);
}
Console.WriteLine();
}
现在我知道一个未发布的方法可能对您没有帮助,尤其是当您要求不使用 linq 时。但是it's not really linq if you implement the method yourself:
public static IEnumerable<T[]> Chunk<T>(this IEnumerable<T> values, int chunkSize)
{
T[] items = new T[chunkSize];
int i = 0;
var e = values.GetEnumerator();
while (e.MoveNext())
{
items[i] = e.Current;
i++;
if (i == chunkSize) {
yield return items;
items = new T[chunkSize];
i = 0;
}
}
if (i != 0) //partial array remaining
{
T[] final = new T[i];
while (i>0) final[--i] = items[i];
yield return final;
}
}
看到它在这里工作...
... 并注意顶部缺少 using System.Linq;
。
根据要求,没有 LINQ,使用 .Net 的更简单版本 API:
class Program
{
static void Main(string[] args)
{
char[][] result = ToArrays("Loremipsumdolorsitamet", 5);
WriteResult(result, Console.Out);
}
private static char[][] ToArrays(string text, int arraySize)
{
var arrs = new List<char[]>();
while (!string.IsNullOrEmpty(text))
{
int len = Math.Min(arraySize, text.Length);
string chunk = text.Substring(0, len);
text = text.Substring(len);
arrs.Add(chunk.ToCharArray());
}
return arrs.ToArray();
}
private static void WriteResult(char[][] result, TextWriter writer)
{
writer.WriteLine("{");
foreach (char[] arr in result)
{
writer.Write("\t{ '");
writer.Write(string.Join("', '", arr));
writer.WriteLine("' }");
}
writer.WriteLine("}");
}
}