2011-05-03 7 views
5

Bueno, ya he hecho esto antes, pero estoy dibujando un espacio en blanco, así que espero que los grandes cerebros aquí en SO me puedan rescatar.Cómo encontrar el valor máximo de Item2 en Tuple <string, DateTime>

Tengo un Tuple<string, DateTime> donde la cadena es un nombre de archivo y el DateTime es la última fecha en que el archivo fue enviado por un proceso. Los FileNames no serán idénticos, pero todos confirman a una máscara de archivo de algún tipo (por ejemplo, podría tener varias entradas donde el string cumple con la máscara de archivo "????AD??"). Quiero encontrar el DateTime más reciente para una máscara de archivo determinada.

No puedo recordar cómo resolví este problema antes, y fue en un empleador anterior, por lo que no puedo ni canibalizar mi código anterior. Cualquier ayuda sería muy apreciada.

Aclaración (ya que esto podría ser un poco obtuso)

Dado:

(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) 

quiero volver 8/6/2010

+0

¿Con qué pieza necesita ayuda, haciendo coincidir la máscara de archivo o buscando el máximo en toda su colección? – Rup

+0

encontrar el max. Tengo la máscara de archivo. – AllenG

Respuesta

8

Así que hay tuples es una IEnumerable<Tuple<string, DateTime>> y tiene una fileMask, y usted tiene un método

bool MatchesFileMask(FileMask fileMask, string filename) 

que devuelve true si filename coincide con la máscara de archivo fileMask. Luego, puede decir:

var mostRecent = tuples.Where(x => MatchesFileMask(fileMask, x.Item1) 
         .Max(x => x.Item2); 
6

Pedazo de torta con LINQ:

var data = new List<Tuple<string, DateTime>>(); // add some data 

var maxTimestamp = data.Where(t => MatchesFileMask(t.Item1)).Max(t => t.Item2); 

De Por supuesto que hice trampas al asumir que hay un predicado MatchesFileMask te ya se ha escrito, pero no es demasiado duro para hacer una expresión regular a cabo de una simple máscara de estilo pegote:

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); 
+0

Seleccionaría ambos como correctos si pudiera, pero solo obtengo uno, y Jason está un poco más cerca de lo que necesito para mi solución específica. Up-votado de todos modos. – AllenG

Cuestiones relacionadas