【问题标题】:Lambda expressions, loopLambda 表达式,循环
【发布时间】:2017-09-21 20:06:23
【问题描述】:

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

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

【问题讨论】:

  • Lambda 表达式是廉价的匿名方法;它们不会替换循环。
  • 你可以使用:Enumerable.Repeat("6", 6);
  • 字符串构造函数是很好的信息,感谢 Mat,我睡不着,所以我在玩一些想法。尝试将字符串构造函数与 enumerable.repeat 结合起来,没有得到我期望的结果,但老实说,这是因为我不使用 Enumerable 方法,所以我不确定它们是如何完成工作的。这是我尝试过的 int i = 5; int j = i;char c = '6'; string[] str = Enumerable.Repeat((new string(c, j--)), i).ToArray(); foreach(string s in str) { Console.WriteLine(s); } 我知道为什么它不起作用,不知道为什么我认为它可能哈哈,我猜是深夜

标签: c# loops lambda


【解决方案1】:
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】:

    您的具体示例的 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));
    

    它将打印以下金字塔:

    【讨论】:

      【解决方案3】:
      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多