Tengo una lista de cadenas (nombres de archivo en realidad) y me gustaría conservar solo aquellas que coincidan con una expresión de filtro como: \*_Test.txt
.Cómo filtrar una lista de cadenas que coincidan con un patrón
¿Cuál sería la mejor manera de lograrlo?
Aquí está la respuesta que se me ocurrió:
List<string> files = new List<string>();
files.Add("MyFile1.csv");
files.Add("MyFile1_Test.txt");
files.Add("MyFile2.csv");
files.Add("MyFile2_Test.txt");
files.Add("MyFile3.csv");
files.Add("MyFile3_Test.txt");
files.Add("MyFile_Testtxttxt.txt");
// Define a filter
string filter = "*_Test.txt";
// Make the filter regex safe
foreach (char x in @"\+?|{[()^$.#")
filter = filter.Replace(x.ToString(), @"\" + x.ToString());
filter = string.Format("^{0}$",filter.Replace("*", ".*"));
// Old School
List<string> resultList1 = files.FindAll(delegate(string s) { return Regex.IsMatch(s, filter, RegexOptions.IgnoreCase); });
// Version using LINQ
List<string> resultList2 = files.Where(x => Regex.IsMatch(x, filter, RegexOptions.IgnoreCase) == true).ToList();
me gustaría que el filtro para ser flexible para que pudiera usar \ * \ * o \ * .t \ * o cualquier cantidad de combinaciones . Eliminar el \ * no me daría las coincidencias parciales. – TeamWild
Eeep, una corrección a mi respuesta necesita cambiar la cadena. Formatear a '("^{0} $ ")' de lo contrario, encontrará '" fish_Test.txtWIBBLE "' –