Linq 带参数化初始化的参数化列表.Cast
有很多方法可以将字符串/列表转换为其他内容的列表 出于好奇,我不知道是否有办法这样做Linq 带参数化初始化的参数化列表.Cast,linq,generics,casting,system.io.fileinfo,Linq,Generics,Casting,System.io.fileinfo,有很多方法可以将字符串/列表转换为其他内容的列表 出于好奇,我不知道是否有办法这样做 Directory.EnumerateFiles(@"C:\Drivers").ToList<FileInfo>(); 或者 new List<string>(Directory.EnumerateFiles(@"C:\Drivers")).Cast<FileInfo>();` ` 由于fileinfo使用FileInfopath作为参数,因此有一种方法可以这样做,或者使
Directory.EnumerateFiles(@"C:\Drivers").ToList<FileInfo>();
或者
new List<string>(Directory.EnumerateFiles(@"C:\Drivers")).Cast<FileInfo>();`
`
由于fileinfo使用FileInfopath作为参数,因此有一种方法可以这样做,或者使用一个简短的oneliner,它不涉及linq Selectx=>new FileInfox或类似的内容?没有内置的方法可以绑定到构造函数。我不知道您为什么不想选择Selectx=>new FileInfox。但是,如果要定义扩展方法(如以下构造)来执行绑定,则可以:
static void Main(string[] args)
{
const string path = "d:\\";
var results = Directory.EnumerateFiles(path).Construct<string, FileInfo>();
}
private static ConcurrentDictionary<Type, object> constructors = new ConcurrentDictionary<Type, object>();
private static IEnumerable<TOutput> Construct<TInput, TOutput>(this IEnumerable<TInput> input)
{
var constructor = constructors.GetOrAdd(typeof(TOutput), (Type type) =>
{
var parameterExpression = Expression.Parameter(typeof(TInput));
var matchingConstructor = typeof(TOutput).GetConstructor(new[] { typeof(TInput) });
var expression = Expression.Lambda<Func<TInput, TOutput>>(Expression.New(matchingConstructor, parameterExpression), parameterExpression);
return (object)expression.Compile();
});
return input.Select(x => ((Func<TInput,TOutput>)constructor)(x));
}
谢谢:如果没有,我会用select,就像我问的那样