C# 日期数组,检查日期是否存在
我有一个对象成员C# 日期数组,检查日期是否存在,c#,linq,C#,Linq,我有一个对象成员 Member PropertyA PropertyZ Membership[] Memberships 成员对象是 Membership PropertyA PropertyZ string Status DateTime? StartDate DateTime? EndDate 如果我现在有 var members = GetAllMembers(DateTime.Now); 我想知道会员今天是否有活跃会员 // iterating throu
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"
}
问题是,
我不知道如何检查任何属于今天日期的会员持续时间和会员状态是否也为“活动”以检查targetdt(DateTime.Now)是否介于StartDate和EndDate之间:
if (member.Memberships.Any(x=>targetDt.Ticks > x.StartDate.Ticks && targetDt.Ticks < x.EndDate.Ticks && x.Status=="Active"))
{
// Has membership on targetDt.
}
if(member.Memberships.Any(x=>targetDt.Ticks>x.StartDate.Ticks&&targetDt.Ticks
要检查targetdt(DateTime.Now)是否介于StartDate和EndDate之间,请执行以下操作:
if (member.Memberships.Any(x=>targetDt.Ticks > x.StartDate.Ticks && targetDt.Ticks < x.EndDate.Ticks && x.Status=="Active"))
{
// Has membership on targetDt.
}
if(member.Memberships.Any(x=>targetDt.Ticks>x.StartDate.Ticks&&targetDt.Ticks
我假设开始或结束日期的空值表示“打开”间隔
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)));
var today=DateTime.Now;
var activeMembers=allMembers.Where(m=>
m、 会员资格。任何(ms=>
ms.状态==“活动”&&
(ms.StartDate==null | | ms.StartDate我假设开始或结束日期的null值表示“打开”间隔
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)));
var today=DateTime.Now;
var activeMembers=allMembers.Where(m=>
m、 会员资格。任何(ms=>
ms.状态==“活动”&&
(ms.StartDate==null | | ms.StartDate,因此我将构造与您现在的主类稍有不同的主类。这是为了避免必须比较字符串的状态,但是因为我不知道如何设置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
属性,但这更多地包含在基于日期的membership
活动性测试中。因此这些数据的使用者不需要知道如何说成员身份处于活动状态
,他们只需要知道一些将处于活动状态,而另一些将处于停用状态。因此,我将构建与您现在的主类稍有不同的主类。这是为了避免必须对stat的字符串进行比较美国,但由于我不知道如何准确设置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
属性,但这更多地包含在基于日期的membership
活动性测试中。因此这些数据的消费者不需要知道如何说成员身份处于活动状态
,他们只需要知道一些成员将处于活动状态,而另一些成员将处于停用状态。那么问题/问题是什么呢?@Markus update my question那么问题/问题是什么呢?@Markus update my question看起来不错,但我们不应该只是比较日期而不是完整的日期时间?只是为了避免奇怪的错误…@Markus谁知道呢。有时会员资格结束时间可以到下午6点。如果我们只检查日期,我们可能会遇到一些问题。这取决于具体的实现:)也可以是明天的00:00:00,因此午夜后的时间检查不会通过。也可以是23:59:59(通常我们使用这种方法).所以我更喜欢用小时和秒来精确检查当前时间。是的,的确-我只是认为它可能是日期,因为OP调用了他的变量StarteDate和EndDate…而您的变量称为today
…现在应该是我猜看起来不错,但我们不应该只比较日期而不是完整的日期时间吗?只是为了避免出现奇怪的错误…@Markus谁知道呢。有时会员结束时间可以是下午6点。如果我们只检查日期,我们可能会遇到一些问题。这取决于具体的实现:)也可以是明天00:00:00,所以午夜后的时间检查不会通过。或者可以是23:59:59(通常我们使用这种方法).所以我更喜欢用小时和秒来精确检查当前时间。是的,我只是认为它可能是日期,因为OP调用了他的变量StarteDate和EndDate…而您的变量名为today
…我想应该是now