迭代中的努力-FizzBu​​zz

编辑对于它的价值,哪个承认可能不那么多。我已经做了一些测试以扩展这个问题。 我编写了两个函数来枚举FizzBu​​zz“系列”。
private static IEnumerable<string> SimpleFizzBuzz(
        int start = 0,
        int end = int.MaxValue)
{
    return Enumerable.Range(start, end).Select(i =>
        i % 15 == 0 ? \"fizzbuzz\" :
        i % 3 == 0 ? \"fizz\" :
        i % 5 == 0 ? \"buzz\" :
        i.ToString(CultureInfo.InvariantCulture));
}
和,
private static IEnumerable<string> OptimizedFizzBuzz(
        int start = 0,
        int end = int.MaxValue)
{
    const int fizz = 3;
    const int buzz = 5;
    const string fizzString = \"fizz\";
    const string buzzString = \"buzz\";
    const string fizzBuzzString = fizzString + buzzString;

    var fizzer = start % fizz;
    var buzzer = start % buzz;

    if (fizzer == 0)
    {
        fizzer = fizz;
    }

    if (buzzer == 0)
    {
        buzzer = buzz;
    }

    for (var i = start; i <= end; i++)
    {
        if (buzzer == buzz)
        {
            if (fizzer == fizz)
            {
                yield return fizzBuzzString;
                buzzer = 1;
                fizzer = 1;
                continue;
            }

            yield return buzzString;
            buzzer = 1;
            fizzer++;
            continue;
        }

        if (fizzer == fizz)
        {
            yield return fizzString;
            buzzer++;
            fizzer = 1;
            continue;
        }

        yield return i.ToString(CultureInfo.InvariantCulture);
        fizzer++;
        buzzer++;
    }
}
我做了一些时间安排,在Release配置中进行了编译,并进行了优化并从命令行运行。经过ѭ2次迭代,没有实际报告每个项目的开销,我得到的结果近似于:   简单:14.5秒      优化:10秒 您会注意到,“优化”功能更快但更详细。只需更改其头部的常量即可更改其行为。 抱歉,这似乎有点琐碎。 考虑此功能。
using System.Text;

public string FizzBanger(int bound)
{
    StringBuilder result = new StringBuilder();
    for (int i = 1; i < bound; i++)
    {
        String line = String.Empty;
        if (i % 3 == 0) line += \"fizz\";
        if (i % 5 == 0) line += \"buzz\";
        if (String.IsNullOrEmpty(line)) line = i.ToString();
        result.AppendLine(line.ToString());
    }
    return result.ToString();
}
输出看起来像
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
16
...
有人能想到一种更好的方法吗?请同时考虑性能和可维护性。     
已邀请:
StringBuilder result = new StringBuilder();
对于固定的上限(100),我不会为此而烦恼,但是…
StringBuilder line = new StringBuilder();
但这7英镑不仅多余,而且效率很低。而且我甚至不需要进行基准测试就可以知道这一点。
if (line.Length == 0)
这只会掩盖逻辑(应该实现“ fizzbuzz”问题,对吗?)。明确逻辑。   请同时考虑性能和可维护性。 那是错误的方法。可维护性第一,性能第二(如果有的话)。您的代码实际上效率很低,但这无关紧要:有100次迭代-性能根本不重要。 此外,此代码有哪些可维护性开销?这是具有固定规格的玩具样品。没有可维护性问题。我什至不会在这里花任何心思,Linq巧妙地解决了这个问题:
return Enumerable.Range(1, bound - 1).Aggregate(\"\",
    (accu, i) =>
        string.Format(\"{0}\\n{1}\", accu,
            i % 15 == 0 ? \"fizzbuzz\" :
            i % 3 == 0 ? \"fizz\" :
            i % 5 == 0 ? \"buzz\" : i.ToString()));
但是我同意,如果不习惯
Aggregate
功能,这可能会影响可读性。因此,使其更加明确:
var result = new StringBuilder();
for (int i = 1; i < bound; i++)
    result.AppendLine(
        i % 15 == 0 ? \"fizzbuzz\" :
        i % 3 == 0 ? \"fizz\" :
        i % 5 == 0 ? \"buzz\" : i.ToString());
return result.ToString();
其他一切都过度设计。     
假设您的代码仅是您要实现的目标的示例...创建较少StringBuilders的建议:
{
      StringBuilder result = new StringBuilder();
      for (int i = 1; i < 101; i++)
      {
           var rest3 = i % 3;
           var rest5 = i % 5;

           if (rest3 == 0) result.Append(\"fizz\");
           if (rest5 == 0) result.Append(\"bang\");
           if (rest3 != 0 && rest5 != 0)
               result.Append(i);

           result.Append(System.Environment.NewLine);
      }
}
    
如果我们使事情变得更加困难怎么办? 1)不允许除法或取模运算; 2)循环必须跳过所有不必要的迭代。 答案是:
int n3 = 3;
int n5 = 5;
int i = 3;
while (i <= 100)
{
    Console.Write(i.ToString() + \" - \");

    if (i == n3)
    {
        Console.Write(\"fizz\");

        n3 = n3 + 3;
    }

    if (i == n5)
    {
        Console.Write(\"buzz\");

        n5 = n5 + 5;
    }

    Console.WriteLine();

    i = n3 < n5 ? n3 : n5;
}
    

要回复问题请先登录注册