用 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语句来做到这一点。但我不认为这是这种情况最好(也是最短)的方法。这就是我现在想问你的:有没有更短的解决方案来达到相同的结果?

用 0 到 9 之间的数字填充字符串,然后从新开始,直到长度为 50

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());

您可以使用 RangeRepeat 来使其简洁,并避免编写有利于 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());