C#比较DateTime和mask的方法

C#比较DateTime和mask的方法,c#,datetime,filter,compare,mask,C#,Datetime,Filter,Compare,Mask,比如说,我们有一个DateTime,设置了一些字段,例如仅Month和Day。这是一个面具。我们希望通过此掩码筛选日期时间列表: 如果X的月份和日期与掩码的月份和日期相同,则匹配X,如果掩码未设置,则匹配其他字段中的任何其他值(零) 当然,我可以对每个可能的字段进行大量的比较,但我相信.NET库。我正在寻找一个很好的方法来做这件事,不管有没有LINQ 在现实世界中,这就像指定一年来查找今年的所有对应条目,或者指定月份和日期来查找这些月份和日期(任何年份和时间)的所有内容 编辑:我正在寻找一种本地

比如说,我们有一个
DateTime
,设置了一些字段,例如仅
Month
Day
。这是一个面具。我们希望通过此掩码筛选日期时间列表:

如果X的月份和日期与掩码的月份和日期相同,则匹配X,如果掩码未设置,则匹配其他字段中的任何其他值(零)

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

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


编辑:我正在寻找一种本地的方式来说明代表“2010”和“2010/02/01”的日期之间存在某种关系(基本上,“2010”包括更具体的“2010/02/01”)。我以前调用过“2010”掩码。

因此,首先,
DateTime
不是掩码的良好表示形式,因为它不能没有年份、月份或日期等。创建一个新类来表示掩码,该掩码的每个属性都有可为空的值:

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;
}
公共静态IEnumerable筛选器日期(IEnumerable日期、日期掩码)
{
var查询=日期;
if(掩码.年份.值)
query=query.Where(date=>date.Year==mask.Year);
if(掩码.月.值)
query=query.Where(日期=>date.Month==mask.Month);
if(mask.Day.HasValue)
query=query.Where(date=>date.Day==mask.Day);
返回查询;
}
(您可以按照该模式添加
if
/
Where
,以获取添加到掩码的其他属性。)

(您可能还想将该方法重构为
日期掩码的实例方法。)

一个想法:

        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));
List dt=newlist();
新增日期时间(2010年11月11日);
新增日期时间(2010年7月25日);
新增日期时间(2011年5月11日);
新增日期时间(2011年11月13日);
新增日期时间(2013年7月13日);
dt.Add(新日期时间(2013年1月13日));
dt.Add(新日期时间(2012年1月11日));
字符串userInputMask=“201_u-07-u;”;
字符串掩码=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-07-25 00:00:00

2013-07-13 00:00:00


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

这些数字是否存储在某个集合中?大多数集合允许您实现
IEqualityComparer
IComparer
,您可以为要检查的每个掩码提供一个实现,并提供该实现。或者有一系列静态方法供LINQ
Where
调用。@Adam Houldsworth:是的,我知道这些,我的问题是关于比较日期时间的本机方法。我将把这个问题包括在内。一个清晰的想法和干净的实现,谢谢!但这需要自定义类和比较。所以,没有一种天然的方法来确定DateTimes的“部分相等”吗?@Rast不,没有,正如我在文章开头所说的那样。一个
DateTime
必须表示一个特定的日期和时间,它不是用来表示一个带有一些未知值的掩码的。疯狂与否,它工作:)它基本上是两行代码,其余的只是上下文。虽然我不知道它是否正是你想要的。非常优雅,易于编码。另一方面,使用正则表达式意味着性能不佳