Я ищу короткий, современный код С# для создания случайной даты между 1 января 1995 года и текущей датой.
Я думаю о каком-то решении, которое использует Enumerable.Range каким-то образом может сделать это более кратким.
Я ищу короткий, современный код С# для создания случайной даты между 1 января 1995 года и текущей датой.
Я думаю о каком-то решении, которое использует 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
) вне функции.
Это в некотором отклике на комментарий Джоэла о создании более оптимизированной версии. Вместо того, чтобы напрямую возвращать случайную дату, почему бы не вернуть функцию генератора, которая может быть вызвана повторно для создания случайной даты.
Func<DateTime> RandomDayFunc()
{
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 IEnumerable<DateTime> RandomDay()
{
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;
}
Начните с объекта с фиксированной датой (1 января 1995 года) и добавьте случайное число дней с помощью AddDays (obviusly, обратите внимание, не превышая текущую дату).