.Where(Date.AddHours) filter doesn't seem to work

I'm sorting a list of files that was created from yesterday 1:00pm to present time. I'm trying to use the following code: The messagebox shows the correct time I'm trying to reference, but the filter doesn't seem to work. If I remove the "AddHours(13)" it does filter correctly.

MessageBox.Show(DateTime.Now.Date.AddDays(-1).AddHours(13).ToString());
string[] files = Directory.GetFiles(FBD.SelectedPath, "*.xls")
    .Where(file => new FileInfo(file).CreationTime.Date >= (DateTime.Now.Date.AddDays(-1).AddHours(13)) && file.Contains("AA"))
    .OrderBy(file => new FileInfo(file).CreationTime.Date)
    .ToArray(); 

What am I missing?

Jon Skeet
people
quotationmark

DateTime.Now.Date.AddDays(-1).AddHours(13) will return 1pm... but you're checking against new FileInfo(file).CreationTime.Date, which is always at midnight... for a file created yesterday, it will be yesterday at midnight.

So yes, you're filtering out that file. If you remove the .Date part from new FileInfo(file).CreationTime that may well be all you need to do.

As a side-note, I'd use DateTime.Today instead of DateTime.Now.Date, and I'd also try to avoid evaluating it multiple times. I'd also use DirectoryInfo and stick to FileInfo entries given that you're already creating those twoce. I'd rewrite your query as something like:

var cutoff = DateTime.Today.AddDays(-1).AddHours(13);
FileInfo[] files = new DirectoryInfo(FBD.SelectedPath).GetFiles("*.xls")
    .Where(file => file.CreationTime >= cutoff)
    .OrderBy(file => file.CreationTime)
    .ToArray();

people

See more on this question at Stackoverflow