有没有人知道如何通过Lambda表达式实现这样的目标?
public static string getString(char c, int lenght)
{
char[] temp = new char[lenght];
for (int i = 0; lenght > 0; lenght--, i++)
{
temp[i] = c;
}
return new string(temp);
}
这是我循环的一个小方法:
for (int i = 0, j = width; j > 0; j--, i++)
{
item[i] = getString((char)(value + 48), j);
Console.WriteLine(item[i]);
}
输出1到9之间的数字三角形。
示例:
666666
66666
6666
666
66
6
我从未使用过Lambda,但是想学习它来实现这样的小循环。
如果有人知道一个充满示例的地方,请指出我的方向。
答案 0 :(得分:0)
针对您的具体示例的LINQ解决方案如下:
private string GeneratePyramid(int number, int pyramidHeight)
{
return string.Concat(Enumerable.Repeat(true, pyramidHeight).Select((n, i) => {
return new string(Convert.ToChar(number.ToString()), pyramidHeight - i) +
Environment.NewLine;
}));
}
(从@Matthew Whited关于new string(char, count)
的回答中采用了一些不错的技巧,而不必扭转我的结果)
我们利用Enumerable.Repeat
创建一个数组
s长度等于pyramidHeight
,之后我们再次使用Enumerable.Repeat
创建一个number
重复i
(索引)次的字符串。
select方法会创建一个IEnumerable
,但如上所述,我们希望将生成的字符串数组展平为单个字符串,因此我们再次使用string.Concat
为我们执行此操作。
当这样调用时:
Console.WriteLine(GeneratePyramid(9, 12));
它将打印以下金字塔:
答案 1 :(得分:0)
var lines = Enumerable.Range(0, 6)
.Select(i => new string('6', 6 - i));
foreach (var line in lines)
Console.WriteLine(line);
输出
666666
66666
6666
666
66
6
答案 2 :(得分:0)
char c = (char)(size + 48);
IEnumerable<string> pyramid = Enumerable.Range(1, size)
.Reverse()
.Select(i => new String(c, i);
foreach(string line in pyramid)
{
Console.WriteLine(line);
}