C# 用0到9之间的数字填充字符串,然后重新开始,直到长度为50为止
我今天看到了。现在我想得更远了,并提出了以下场景:C# 用0到9之间的数字填充字符串,然后重新开始,直到长度为50为止,c#,arrays,string,C#,Arrays,String,我今天看到了。现在我想得更远了,并提出了以下场景: string myString = "Hello"; int[] numbersFromZeroToNine = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 我想将numbersfromzerotine中的数字添加到myString(在0位置重新启动),直到myString的长度为50。如果myString已经超过50个字符,我想打印出前50个字符 我可以通过以下几行来实现: if (myString.Le
string myString = "Hello";
int[] numbersFromZeroToNine = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
我想将numbersfromzerotine
中的数字添加到myString
(在0
位置重新启动),直到myString
的长度为50。如果myString
已经超过50个字符,我想打印出前50个字符
我可以通过以下几行来实现:
if (myString.Length >= 50)
myString = myString.Substring(0, 50);
else
{
for (int counter = 0; myString.Length < 50; counter++)
{
if (counter == numbersFromZeroToNine.Count())
counter = 0;
myString += numbersFromZeroToNine[counter];
}
}
Console.WriteLine(myString);
Console.ReadLine();
if(myString.Length>=50)
myString=myString.Substring(0,50);
其他的
{
对于(int counter=0;myString.Length<50;counter++)
{
if(counter==numbersfromzerotine.Count())
计数器=0;
myString+=numbersFromZeroToNine[计数器];
}
}
Console.WriteLine(myString);
Console.ReadLine();
结果:
你好01234567890123456789012345678901234567890123456789012345678901234
如您所见,我可以通过使用
for
循环和else
中的if
语句来实现。但我不认为这是这种情况下最好(也是最短)的方法。这就是我现在想问你的:有没有一个更短的解决方案可以达到相同的结果?你可以使用LINQ和字符串。Concat
和模(%
):
但是,如果这是更好的是相当基于意见。如果速度更快,则需要测量。更简洁,但恐怕可读性较差的Linq解决方案:
string prefix = "Hello";
int length = 50;
// Hello012345678901234567890123456789012345678901234
string result = prefix +
new string(Enumerable
.Range(0, length - prefix.Length)
.Select(c => (Char) ('0' + c % 10))
.ToArray());
见下面的代码:
var str = "Hello";
str += new string(Enumerable.Range(0, 50 - str.Length)
.Select(i => (char)('0' + (i % 10))).ToArray());
您可以使用这种LINQ方法,它使用am不定数序列。LINQ延迟执行的一个很好的演示:
IEnumerable<char> numbers = Enumerable.Repeat(numbersFromZeroToNine, int.MaxValue)
.SelectMany(intArr => intArr)
.Select(i => i.ToString()[0]);
if (myString.Length < 50)
{
var chars = myString.ToCharArray().Concat(numbers).Take(50);
myString = String.Concat(chars);
}
您可以使用
Range
和Repeat
使其简洁,并避免编写有利于LINQ的foreach
循环:
var prefix = "Hello";
var numbers = Enumerable.Repeat(
Enumerable.Range(0, 10),
(50 - prefix.Length) / Enumerable.Range(0, 10).Count() + 1)
.SelectMany (e => e.Select (x => x)).ToArray();
var myString = (prefix +
string.Join("", numbers.Select (n => n.ToString()))).Substring(0, 50);
这只是同一主题的另一个变体,但使用了StringBuilder和老式的for循环
var builder = new StringBuilder("Hello");
for(var i=0; builder.Length<50; ++i) { builder.Append((char)('0'+(i%10))); }
Console.WriteLine(builder.ToString());
var builder=newstringbuilder(“你好”);
对于(var i=0;builder.length我想你可以使用递归,但我不确定它是否会被认为更短。这是一个不错的解决方案,尽管可读性较差。我没有考虑使用Linq。这可能会奏效,但我认为它的可读性甚至比其他答案中的解决方案还要差。@diiN\ux:可能,但它更通用,并且还展示了如何使用它LINQ的延迟执行是为了获得相同序列的无限重复,而不是真正生成它。您可以将Take(50)
更改为您想要的任何长度。使用Take
是避免编写该循环的聪明方法。
var prefix = "Hello";
var numbers = Enumerable.Repeat(
Enumerable.Range(0, 10),
(50 - prefix.Length) / Enumerable.Range(0, 10).Count() + 1)
.SelectMany (e => e.Select (x => x)).ToArray();
var myString = (prefix +
string.Join("", numbers.Select (n => n.ToString()))).Substring(0, 50);
var builder = new StringBuilder("Hello");
for(var i=0; builder.Length<50; ++i) { builder.Append((char)('0'+(i%10))); }
Console.WriteLine(builder.ToString());