gpt4 book ai didi

c# - 值的范围 - 如何在没有 if 循环的情况下确定?

转载 作者:太空宇宙 更新时间:2023-11-03 17:41:08 25 4
gpt4 key购买 nike

我需要根据年龄找到给定人的太阳星座

例如,

Capricorn   December 22 – January 20
Aquarius January 21 – February 18
Pisces February 19 – March 19
Aries March 20 – April 19
Taurus April 20 – May 20
Gemini May 21 – June 20
Cancer June 21 – July 22
Leo July 23 – August 22
Virgo August 23 – September 22
Libra September 23 – October 22
Scorpio October 23 – November 21
Sagittarius November 22 – December 21

这段代码是我写的

 public enum Months
{
January = 1, February, March, April, May, June, July, August, September, October, November, December,
}

var person = new Person(name:"mady", age:20, dateTime: new DateTime(2011,09,16));
if (person.DOB.Month == (int)Months.December)
{
if (person.DOB.Day >= 22)
return "Capricorn";
else
return "Sagittarius";
} ...
....
....
....

IF 语句持续增长,如果明天列表增长,可能会成为一场噩梦。

有没有一种优雅的方法可以找出 Sunsign ? .NET 中的 EnumerableRange 似乎不适合这种情况,或者这是编写代码的唯一方法吗?

最佳答案

创建一个类 StarSign:

class StarSign
{
public readonly string Name;
public readonly DateTime StartDate;
public readonly DateTime EndDate;

public bool Contains(DateTime date);
}

将所有星座添加到集合 StarSigns 中。然后对于任何给定的 DateTime 日期(该人的)做

foreach (var sign in StarSigns)
{
if (sign.Contains(date))
{
Console.WriteLine("I am a: " + sign.Name);
break;
}
}

编辑,回复您的评论:

Contains 函数可以轻松比较日期,只需确保忽略年份即可:

public bool Contains(DateTime date)
{
DateTime startNoYear = new DateTime(1904, StartDate.Month, StartDate.Day);
DateTime endNoYear = new DateTime(1904, EndDate.Month, EndDate.Day);
DateTime dateNoYear = new DateTime(1904, date.Month, date.Day);

return dateNoYear >= startNoYear && dateNoYear <= endNoYear;
}

所以是的,如果您有很多 StarSigns,这会影响性能。通常你只会有 12 个,因为你知道你正在处理一个封闭的集,你可以这样做。

在优化方面,您还需要存储 startNoYear 和 endNoYear,而不是在每次运行 Contains 时都计算它们。在构造函数中计算它们;我只是在方法中这样做,这样更容易理解。更快的方法是直接处理 DateTime 属性并避免完全创建新的 DateTime 对象。就此示例而言,我选择简单而不是优化。

关于c# - 值的范围 - 如何在没有 if 循环的情况下确定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21553099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com