好吧,我之前已经这样做了,但是我正在画一个空白,所以我希望这里的大脑能帮助我摆脱困境。
我有一个Tuple<string, DateTime>
,其中字符串是FileName,DateTime是进程发送文件的最后日期。 FileNames将不相同,但它们都确认某种文件掩码(例如,我可能有几个条目string
符合文件掩码"????AD??"
)。我想找到给定文件掩码的最新DateTime
。
我不记得以前我是如何解决这个问题的,而且是在以前的雇主那里,所以我甚至无法蚕食我的旧代码。任何帮助将不胜感激。
澄清(因为这可能有点迟钝)
假设:
(0501AD01, 5/2/2010)
(0502AD02, 5/3/2010)
(0503AD03, 5/4/2010)
<snip>
(0803AD99, 8/4/2010)
(0804AD00, 8/5/2010)
(0805AD01, 8/6/2010)
我想要返回8/6/2010
答案 0 :(得分:8)
所以你tuples
是IEnumerable<Tuple<string, DateTime>>
而你有fileMask
,你有方法
bool MatchesFileMask(FileMask fileMask, string filename)
如果true
与文件掩码filename
匹配,则返回fileMask
。然后你可以说:
var mostRecent = tuples.Where(x => MatchesFileMask(fileMask, x.Item1)
.Max(x => x.Item2);
答案 1 :(得分:6)
LINQ的小蛋糕:
var data = new List<Tuple<string, DateTime>>(); // add some data
var maxTimestamp = data.Where(t => MatchesFileMask(t.Item1)).Max(t => t.Item2);
当然我假设已经编写了一个MatchesFileMask
谓词而作弊,但是用一个简单的全局式掩码制作一个正则表达式并不太难:
var mask = "????AD??";
var regex = new Regex(mask.Replace('?', '.').Replace("*", ".*"));
var predicate = new Func<string, bool>(regex.IsMatch);
var maxTimestamp = data.Where(t => predicate(t.Item1)).Max(t => t.Item2);