C#将DateTime与掩码进行比较的方法
本文关键字:比较 方法 掩码 DateTime | 更新日期: 2023-09-27 18:26:47
假设我们有一个DateTime
,其中设置了一些字段,例如只有Month
和Day
。这是一个面具。我们想通过这个掩码过滤DateTimes列表:
匹配X,如果X的Month和Day与mask相同,以及其他字段中的任何其他值,如果mask未设置这些值(零)。
当然,我可以对每个可能的字段进行大量比较,但我相信.NET库。我正在寻找一种很好的方法来做到这一点,无论有没有LINQ。
这在现实世界中的用法就像指定一年来查找该年的所有对应条目,或者指定月份和日期来查找这些月份和日期(任何年份和时间)的所有内容
编辑:我正在寻找一种本土的方式来说明代表"2010"answers"2010/02/01"的日期是某种关系(基本上,"2010"包括更具体的"2010/02/1")。我之前称之为"2010"面具。
因此,首先,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表示一个数字。为了简单起见,用户输入屏蔽数字,例如下划线字符