2015-10-15 56 views
1

我有一个对象成员,阵列的日期,检查日期存在

Member 
PropertyA 
PropertyZ 
Membership[] Memberships 

及会员对象是

Membership 
PropertyA 
PropertyZ 
string Status 
DateTime? StartDate 
DateTime? EndDate 

如果我现在有,

var members = GetAllMembers(DateTime.Now); 

我想找出会员今天是否有任何活跃会员,

// iterating through each member here 
    if(member.Memberships.Any()) 
    { 
     // check if user has any membership duration that falls into 
     // today's date and membership status is also "active" 
    } 

问题是,

我不知道如何检查是否落入今天的日期和成员地位的成员资格有效期为也“主动”

+0

那么问题是什么? – Markus

+0

@Markus更新我的问题 – Mathematics

回答

2

来检查targetdt(DateTime.Now )是起始日期之间&结束日期:

if (member.Memberships.Any(x=>targetDt.Ticks > x.StartDate.Ticks && targetDt.Ticks < x.EndDate.Ticks && x.Status=="Active")) 
{ 
    // Has membership on targetDt. 
} 
2

我假定为开始或结束日期手段“开放的”间隔

012空值
var today = DateTime.Now; 
var activeMembers = allMembers.Where(m => 
    m.Memberships.Any(ms => 
     ms.Status == "Active" && 
     (ms.StartDate == null || ms.StartDate <= today) && (ms.EndDate == null || today <= ms.EndDate))); 
+0

看起来不错,但我们不应该只比较日期而不是完整的日期时间吗?只是为了避免怪异的错误... – Markus

+0

@Markus谁知道。有时会员结束时间可能会持续到下午6点。如果我们检查日期,我们可能会遇到一些问题。这取决于具体的实施:)它也可以是直到明天的00:00:00,因此在午夜之后的时间检查将不会通过。或者它可以是23:59:59(通常我们使用这种方法)。所以我更喜欢用小时和秒来精确检查当前时间。 –

+0

是的 - 我只是以为它可能是日期,因为OP已经调用了他的变量StarteDate和EndDate ...而你的变量被称为'today' ...应该是'now'我猜 – Markus

2

因此,我会构建你的主要类与你现在有更多不同。这让它不得不比较字符串中的状态,但是因为我不知道active属性是如何设置的,但我会假设对于要激活的成员来说,开始和(可选)结束日期必须是小于并且大于今天的日期。

class Member 
{ 
    private readonly IList<Membership> memberships; 

    public Member() 
    { 
     memberships = new List<Membership>(); 
    } 

    public ReadOnlyCollection<Membership> Memberships 
    { 
     get 
     { 
      return new ReadOnlyCollection<Membership>(memberships); 
     } 
    } 
} 

class Membership 
{ 
    private readonly DateTime endDate; 

    private readonly DateTime startDate; 

    public Membership(DateTime startDate) 
    { 
     this.startDate = startDate; 
    } 

    DateTime StartDate 
    { 
     get 
     { 
      return this.startDate; 
     } 
    } 

    DateTime? EndDate 
    { 
     get 
     { 
      return endDate; 
     } 
    } 

    public Status Status 
    { 
     get 
     { 
      return CalculateMemebershipStatus(); 
     } 
    } 

    private Status CalculateMemebershipStatus() 
    { 
     var todaysDate = DateTime.Today; 

     if (StartDate > todaysDate) 
     { 
      return Status.Deactivated; 
     } 

     if (!EndDate.HasValue) 
     { 
      return Status.Active; 
     } 

     if (todaysDate < EndDate.Value) 
     { 
      return Status.Active; 
     } 

     return Status.Deactivated; 
    } 
} 

enum Status 
{ 
    Active, 
    Deactivated 
} 

而当你需要找出所有今天有一个active成员的成员,你可以这样做:

var memberCollection = new List<Member>(); 
... 
var activeMembers = memberCollection.Where(x => x.Memberships.Any(y=> y.Status == Status.Active)); 

因此,这将通过你的成员集合,并选择具有积极的那些今天的地位。尽管如前所述,这取决于你如何构建active属性,但这更多地包含在测试中,基于日期的membership的活动性在成员对象内完成。所以这个数据的消费者并不需要知道如何说membershipactive他们只需要知道一些将被激活而另一些将被停用。