Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 带参数化初始化的参数化列表.Cast_Linq_Generics_Casting_System.io.fileinfo - Fatal编程技术网

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,就像我问的那样