所以今天我见过this question。现在我想了一下,想出了以下场景:
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();
结果:
Hello012345678901234567890123456789012345678901234
如您所见,我可以在for
内使用if
循环和else
语句来完成此操作。但我不认为这是这种情况下最好(也是最短)的方法。这就是我现在想问你的问题:是否有更短的解决方案来实现相同的结果?
答案 0 :(得分:4)
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());
答案 1 :(得分:3)
你可以使用这种使用am indefinit数字序列的LINQ方法。 LINQ延迟执行的一个很好的演示:
die()
但是首先存储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[]
答案 2 :(得分:2)
你可以使用LINQ和string.Concat
以及modulo(%
)来实现:
myString += string.Concat(Enumerable.Range(0, 50 - myString.Length).Select(i => i % 10));
但如果这是更好是基于意见。如果更快要测量。
答案 3 :(得分:2)
见下面的代码:
var str = "Hello";
str += new string(Enumerable.Range(0, 50 - str.Length)
.Select(i => (char)('0' + (i % 10))).ToArray());
答案 4 :(得分:0)
您可以使用Range
和Repeat
来简化并避免编写foreach
循环以支持LINQ:
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);
答案 5 :(得分:0)
只是同一主题的另一个变体,但使用StringBuilder和老式for循环。
struct()