1

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

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

当然,我可以对每个可能的领域进行大量比较,但我相信 .NET 库。我正在寻找一种很好的方法,无论是否使用 LINQ。

实际使用就像指定年份来查找今年的所有对应条目,或者指定月份和日期来查找这些月份和日期(任何年份和时间)的所有内容

编辑:我正在寻找一种原生方式来告诉代表“2010”和“2010/02/01”的日期存在某种关系(基本上,“2010”包括“2010/02/01”更具体)。我以前叫“2010”面具。

4

2 回答 2

2

因此,首先,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;
}

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

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

于 2013-08-07T13:57:46.370 回答
0

一个想法:

        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-07-25 00:00:00

2013-07-13 00:00:00

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

于 2013-08-07T14:05:48.790 回答