using System; using System.IO; using System.Linq; using System.Linq.Expressions;
internal static string[] EnumerateMultiExtensionFiles(string directory, string searchPattern, SearchOption searchOption) { IQueryable<string> queayableFiles = Directory.GetFiles(directory, "*.*", searchOption).AsQueryable<string>(); string[] exts = searchPattern.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries); ParameterExpression pe = Expression.Parameter(typeof(string), "ext"); Expression e = null; for (int i = 0; i < exts.Length; i++) { Expression callMethod1 = Expression.Call(pe, typeof(string).GetMethod("ToLower", Type.EmptyTypes)); Expression callMethod2 = Expression.Constant(exts[i]); if (i > 0) { e = Expression.OrElse(e, Expression.Call(callMethod1, typeof(string).GetMethod("EndsWith", new Type[] { typeof(string) }), callMethod2)); } else { e = Expression.Call(callMethod1, typeof(string).GetMethod("EndsWith", new Type[] { typeof(string) }), callMethod2); } } MethodCallExpression whereCallExpression = Expression.Call( typeof(Queryable), "Where", new Type[] { queayableFiles.ElementType }, queayableFiles.Expression, Expression.Lambda<Func<string, bool>>(e, new ParameterExpression[] { pe }) ); IQueryable<string> result = queayableFiles.Provider.CreateQuery<string>(whereCallExpression); return result.ToArray(); }
调用: EnumerateMultiExtensionFiles("x:\\", ".mp3|.flac|.wav", SearchOption.TopDirectoryOnly);