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

标签 c# .net range

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

例如,

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/

相关文章:

c# - 初始化类的要点?

c# - 调试和属性加载

.net - 您最喜欢的 .NET 图表和仪表的开源或免费库是什么?

sql - 创建具有日期/时间范围约束的表以防止重叠

c# - 如何有效地将一个可观察集合中的范围选择到另一个可观察集合中

c# - ActionExecutingContext 和 HttpActionContext 的区别

c# - 如何在C#.net中以.avi扩展名添加视频声音

c# - &lt;meta http-equiv ="X-UA-Compatible"content ="IE=8"/> 在测试环境中不工作?

.net - 如何在 DynamoDB 中存储具有重复项的字符串列表

php - 当验证条件存储在 SQL 数据库中时如何验证用户的日期输入