是否可以使用switch构造在C#中创建FizzBuzz解决方案。我找到了适用于JavaScript和其他语言的解决方案,但是这些(或等效语法)似乎不适用于C#。
作为参考,我将在下面写下if语句版本:
for (int x = 1; x <= 15; x++)
{
if (x % 5 == 0 && x % 3 == 0)
Console.WriteLine("FizzBuzz");
else if (x % 5 == 0)
Console.WriteLine("Buzz");
else if (x % 3 == 0)
Console.WriteLine("Fizz");
else
Console.WriteLine(x);
}
Console.ReadLine();
编辑:忘记输入我的switch语句代码,对此感到抱歉:
for (x = 1; x <= 15; x++)
{
switch (x)
{
case (x % 3 == 0 && x % 5 == 0):
Console.WriteLine("FizzBuzz");
break;
case (x % 5 == 0):
Console.WriteLine("Buzz");
break;
case (x % 3 == 0):
Console.WriteLine("Fizz");
break;
default:
Console.WriteLine(x);
break;
}
}
我的问题是模数语句。错误为“无法将类型bool隐式转换为int。我尝试将switch (x)
替换为switch (true)
,但这并没有多大帮助,只需将每个错误更改为“预期为常数”我的案件。
答案 0 :(得分:1)
此解决方案使用在C#8.0中实现的switch
表达式。允许相当简洁的代码。它还使用本地 static 方法(从8.0版开始也可用):
public static void FizzBuzz(int n)
{
for (var i = 0; i <= n; ++i)
{
var res = i switch
{
var x when is5(x) && is3(x) => "FizzBuzz",
var x when is5(x) => "Fizz",
var x when is3(x) => "Buzz",
_ => i.ToString()
};
Console.WriteLine(res);
}
static bool is3(int x)
{
return x % 3 == 0;
}
static bool is5(int x)
{
return x % 5 == 0;
}
}
答案 1 :(得分:0)
“是否有可能使用switch构造在C#中创建FizzBuzz解决方案”
是的,有可能,但不是很实用(与if
语句相比)。这是因为您打开了一个表达式,然后case语句必须将一个常量表达式与该值进行比较。因此,您无法先执行switch (0)
之后再执行case (i % 15)
,因为i % 15
不是常量表达式。
鉴于此,您可以打开i % 15
以减少与已知基集的比较次数,然后对可以被3、5和15整除的结果进行特殊处理:
for (int x = 1; x <= 15; x++)
{
switch (x % 15)
{
// Evenly divisible by 15
case 0:
Console.WriteLine("FizzBuzz");
break;
// Evenly divisible by 3
case 3:
case 6:
case 9:
case 12:
Console.WriteLine("Fizz");
break;
// Evenly divisible by 5
case 5:
case 10:
Console.WriteLine("Buzz");
break;
// Everything else
default:
Console.WriteLine(x);
break;
}
}
但是if
语句更加简洁:
for (int x = 1; x <= 15; x++)
{
if (x % 15 == 0) Console.WriteLine("FizzBuzz");
else if (x % 3 == 0) Console.WriteLine("Fizz");
else if (x % 5 == 0) Console.WriteLine("Buzz");
else Console.WriteLine(x);
}
答案 2 :(得分:0)
可以将fizzbuzz编写为一个简单的开关。
这几乎与其他方法一样快。我对此非常着迷,并创建了一个小基准,并将其上传到git:https://github.com/chrisaddams/fizzbuzz-everyway-c-sharp
我发现速度的结果如下:
Average Speed of Switch is 63.46 ms
Average Speed of IfElseCont is 62.03 ms
Average Speed of If Else is 60.62 ms
Average Speed of If Only is 73.35 ms
Average Speed of If Cont is 73.55 ms
无论如何,这是代码,我认为这是一个非常简洁易读的解决方案。
using System.Diagnostics;
using System;
namespace fizzbuzz
{
class fizzyCase
{
static void Main(string[] args)
{
Stopwatch timer = new Stopwatch();
timer.Start();
for (int i = 0; i <= 10000; i++)
{
switch (true)
{
case var FizzBuzz when (i % 15 == 0):
Console.WriteLine("fizzbuzz");
break;
case var Fizz when (i % 3 == 0):
Console.WriteLine("fizz");
break;
case var Buzz when (i % 5 == 0):
Console.WriteLine("buzz");
break;
default:
Console.WriteLine(i);
break;
}
}
timer.Stop();
Console.WriteLine("Elapsed:{0}milliseconds", timer.Elapsed.TotalMilliseconds);
}
}
}
答案 3 :(得分:0)
像其他一些人一样,我会在 switch 语句上使用 switch 表达式。但是,我发现使用 tuple pattern 清洁器:
static string FizzBuzz(int i)
{
return (i % 3, i % 5) switch
{
(0, 0) => "FizzBuzz",
(0, _) => "Fizz",
(_, 0) => "Buzz",
(_, _) => i.ToString()
};
}