用 0 到 9 之间的数字填充字符串,然后从新开始,直到长度为 50
本文关键字:然后 从新开始 字符串 之间 填充 数字 | 更新日期: 2024-11-06 09:12:57
所以我今天看到了这个问题。现在我想得更远了,想出了以下场景:
string myString = "Hello";
int[] numbersFromZeroToNine = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
我想将数字从 numbersFromZeroToNine
添加到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();
结果:
您好
012345678901234567890123456789012345678901234
如您所见,我可以在else
中使用for
循环和if
语句来做到这一点。但我不认为这是这种情况最好(也是最短)的方法。这就是我现在想问你的:有没有更短的解决方案来达到相同的结果?
Terser,但恐怕,可读性较差的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());
您可以使用
这种 LINQ 方法,该方法使用不确定的数字序列。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);
}
但是首先存储char[]
会更容易:
char[] digits = "0123456789".ToCharArray();
IEnumerable<char> myChars = myString; // needed to avoid that String.Concat will be used
var infiniteDigits = Enumerable.Repeat(digits, int.MaxValue).SelectMany(arr => arr);
if (myString.Length < 50)
myString = String.Concat(myChars.Concat(infiniteDigits).Take(50));
你可以
使用 LINQ 和 string.Concat
和 modulo ( %
):
myString += string.Concat(Enumerable.Range(0, 50 - myString.Length).Select(i => i % 10));
但如果这更好,那是基于意见的。如果它更快,那就要衡量了。
请参阅下面的代码:
var str = "Hello";
str += new string(Enumerable.Range(0, 50 - str.Length)
.Select(i => (char)('0' + (i % 10))).ToArray());
您可以使用 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());