我正在寻找一些简洁,现代的C#代码,以生成1995年1月1日到当前日期之间的随机日期.
我正在考虑一些利用Enumerable.Range的解决方案可能会使这更简洁.
private Random gen = new Random(); DateTime RandomDay() { DateTime start = new DateTime(1995, 1, 1); int range = (DateTime.Today - start).Days; return start.AddDays(gen.Next(range)); }
为了获得更好的性能,如果重复调用它,请在函数外部创建start
和gen
(甚至可能range
)变量.
这是对Joel关于制作更优化版本的评论的轻微回应.为什么不返回可以重复调用以创建随机日期的生成器函数,而不是直接返回随机日期.
FuncRandomDayFunc() { DateTime start = new DateTime(1995, 1, 1); Random gen = new Random(); int range = ((TimeSpan)(DateTime.Today - start)).Days; return () => start.AddDays(gen.Next(range)); }
我已经采取了@Joel Coehoorn的回答并做出了他所建议的改变 - 将变量放在方法之外并将所有内容都放在课堂上.此外,现在时间也是随机的.这是结果.
class RandomDateTime { DateTime start; Random gen; int range; public RandomDateTime() { start = new DateTime(1995, 1, 1); gen = new Random(); range = (DateTime.Today - start).Days; } public DateTime Next() { return start.AddDays(gen.Next(range)).AddHours(gen.Next(0,24)).AddMinutes(gen.Next(0,60)).AddSeconds(gen.Next(0,60)); } }
并举例说明如何使用100个随机DateTimes来控制:
RandomDateTime date = new RandomDateTime(); for (int i = 0; i < 100; i++) { Console.WriteLine(date.Next()); }
好吧,如果你要提出备用优化,我们也可以选择迭代器:
static IEnumerableRandomDay() { DateTime start = new DateTime(1995, 1, 1); Random gen = new Random(); int range = ((TimeSpan)(DateTime.Today - start)).Days; while (true) yield return start.AddDays(gen.Next(range)); }
你可以像这样使用它:
int i=0; foreach(DateTime dt in RandomDay()) { Console.WriteLine(dt); if (++i == 10) break; }