C#将DateTime与掩码进行比较的方法

本文关键字:比较 方法 掩码 DateTime | 更新日期: 2023-09-27 18:26:47

假设我们有一个DateTime,其中设置了一些字段,例如只有MonthDay。这是一个面具。我们想通过这个掩码过滤DateTimes列表:

匹配X,如果X的Month和Day与mask相同,以及其他字段中的任何其他值,如果mask未设置这些值(零)。

当然,我可以对每个可能的字段进行大量比较,但我相信.NET库。我正在寻找一种很好的方法来做到这一点,无论有没有LINQ。

这在现实世界中的用法就像指定一年来查找该年的所有对应条目,或者指定月份和日期来查找这些月份和日期(任何年份和时间)的所有内容

编辑:我正在寻找一种本土的方式来说明代表"2010"answers"2010/02/01"的日期是某种关系(基本上,"2010"包括更具体的"2010/02/1")。我之前称之为"2010"面具。

C#将DateTime与掩码进行比较的方法

因此,首先,DateTime不能很好地表示您的掩码,因为它不能没有年份、月份或日期等。创建一个新类来表示您的遮罩,每个属性都有可为null的值:

public class DateMask
{
    public int? Year { get; set; }
    public int? Day { get; set; }
    public int? Month { get; set; }
}

(您可以根据需要添加小时、秒、时区等属性。)

既然我们有了一个可以清楚地保存重要信息的掩码,那么编写查询就相当简单了:

public static IEnumerable<DateTime> FilterDates(IEnumerable<DateTime> dates, DateMask mask)
{
    var query = dates;
    if (mask.Year.HasValue)
        query = query.Where(date => date.Year == mask.Year);
    if (mask.Month.HasValue)
        query = query.Where(date => date.Month == mask.Month);
    if (mask.Day.HasValue)
        query = query.Where(date => date.Day == mask.Day);
    return query;
}

(您可以按照模式添加if/Where,用于添加到掩码的其他属性。)

(您可能还想将该方法重构为DateMask的实例方法。)

一个想法:

        List<DateTime> dt = new List<DateTime>();
        dt.Add(new DateTime(2010, 11, 11));
        dt.Add(new DateTime(2010, 7, 25));
        dt.Add(new DateTime(2011, 5, 11));
        dt.Add(new DateTime(2011, 11, 13));
        dt.Add(new DateTime(2013, 7, 13));
        dt.Add(new DateTime(2013, 1, 13));
        dt.Add(new DateTime(2012, 1, 11));
        string userInputMask = "201_-07-__";
        string mask = userInputMask.Replace("_",@"'d");
        var result = dt.Where(a => Regex.IsMatch(@String.Format("{0:yyyy-MM-dd}", a), @mask));
        result.ToList().ForEach(a=>Console.WriteLine(a));

结果:

2010年7月25日00:00:00

2013-07-13 00:00:00

''d表示一个数字。为了简单起见,用户输入屏蔽数字,例如下划线字符