如何在元组<string,datetime =“”> </string,>中找到Item2的最大值

时间:2011-05-03 17:07:16

标签: c#

好吧,我之前已经这样做了,但是我正在画一个空白,所以我希望这里的大脑能帮助我摆脱困境。

我有一个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

2 个答案:

答案 0 :(得分:8)

所以你tuplesIEnumerable<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);