Lambda表达式,循环

时间:2017-09-21 20:06:24

标签: c# loops lambda

有没有人知道如何通过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,但是想学习它来实现这样的小循环。

如果有人知道一个充满示例的地方,请指出我的方向。

3 个答案:

答案 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));

它将打印以下金字塔:

enter image description here

答案 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);
}

看看这个答案。 https://stackoverflow.com/a/471592/8155