Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用0到9之间的数字填充字符串,然后重新开始,直到长度为50为止_C#_Arrays_String - Fatal编程技术网

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