多年来我没有使用静态类型的语言,并且已经设定了C#的速度.我正在使用我通常的技巧,跟随这里的十五个练习
http://www.jobsnake.com/seek/articles/index.cgi?openarticle&8533作为我的第一个任务.
我刚刚完成了第二个斐波纳契任务,并没有花费很长时间,而且工作正常,但在我看来看起来很丑陋,我相信可以在更优雅的代码中获得更少的线条.
我通常喜欢通过配对编程来与已经知道他们正在做什么的人进行学习,但是这个选择对我来说是不开放的,所以我希望在这里发布是最好的.
所以对于所有C#Jedi的那里,如果你要重构下面的代码,它会是什么样的?
using System; using System.Collections; namespace Exercises { class MainClass { public static void Main(string[] args) { Console.WriteLine("Find all fibinacci numbers between:"); int from = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("And:"); int to = Convert.ToInt32(Console.ReadLine()); Fibonacci fibonacci = new Fibonacci(); fibonacci.PrintArrayList(fibonacci.Between(from,to)); } } class Fibonacci { public ArrayList Between(int from,int to) { int last = 1; int penultimate = 0; ArrayList results = new ArrayList(); results.Add(penultimate); results.Add(last); while(last<to) { int fib = last + penultimate; penultimate = last; last = fib; if (fib>from && fib<to) results.Add(fib.ToString()); } return results; } public void PrintArrayList(ArrayList arrayList) { Console.WriteLine("Your Fibonacci sequence:"); Console.Write(arrayList[0]); for(int i = 1; i<arrayList.Count; i++) { Console.Write("," + arrayList[i]); } Console.WriteLine(""); } } }
问候,
克里斯
解决方法
作为迭代器块:
using System; using System.Collections.Generic; using System.Linq; static class Program { static IEnumerable<long> Fibonacci() { long n = 0,m = 1; yield return 0; yield return 1; while (true) { long tmp = n + m; n = m; m = tmp; yield return m; } } static void Main() { foreach (long i in Fibonacci().Take(10)) { Console.WriteLine(i); } } }
这是现在完全懒惰,使用LINQ的Skip / Take等允许您轻松控制开始/结束.例如,对于您的“之间”查询:
foreach (long i in Fibonacci().SkipWhile(x=>x < from).TakeWhile(x=>x <= to)) {...}