2015-10-15 93 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他們只需要知道一些將被激活而另一些將被停用。