Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.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
C# 使用c GetFiles Length,但仅计算文件名中具有一定数量字符的文件_C#_Linq_Getfiles - Fatal编程技术网

C# 使用c GetFiles Length,但仅计算文件名中具有一定数量字符的文件

C# 使用c GetFiles Length,但仅计算文件名中具有一定数量字符的文件,c#,linq,getfiles,C#,Linq,Getfiles,所以我用的是简单的 ImgFilesCount = ImgDirInfo.GetFiles("*.jpg").Length; 计算一个目录中有多少个文件。但我需要它只计算文件名中正好有26个字符的文件。我试过了 ImgFilesCount = ImgDirInfo.GetFiles("?????????????????????????.jpg").Length; 但它不起作用。是执行foreach循环并检查每个文件名和递增计数器的唯一选项吗?我有一种感觉,linq可能可以用.Where语句来

所以我用的是简单的

ImgFilesCount = ImgDirInfo.GetFiles("*.jpg").Length;
计算一个目录中有多少个文件。但我需要它只计算文件名中正好有26个字符的文件。我试过了

ImgFilesCount = ImgDirInfo.GetFiles("?????????????????????????.jpg").Length;
但它不起作用。是执行foreach循环并检查每个文件名和递增计数器的唯一选项吗?我有一种感觉,linq可能可以用.Where语句来实现这一点,但我不知道任何linq。

可能

int count = ImgDirInfo.EnumerateFiles("*.jpg").Count(f => f.Name.Length == 26);
更高效,因为它不需要在开始处理之前将所有文件加载到内存中

使用EnumerateFiles时,可以在返回整个集合之前开始枚举FileInfo对象集合。 使用GetFiles时,必须等待返回整个FileInfo对象数组,然后才能访问该数组。 像这样的

        string[] files = Directory
                         .EnumerateFiles(@"c:\Users\x074\Downloads" , "*.jpg" , SearchOption.AllDirectories )
                         .Where( path => Path.GetFileName(path).Length > 20 )
                         .ToArray()
                         ;

.Wherefname=>conditionfname.LengthGood关于枚举文件的要点。只是一个小小的提示:Count是否会加载所有文件,从而使枚举文件的流性质变得无关紧要?@IlyaIvanov哦,不。这就是迭代器的全部优点。Count扩展名方法在计数过程中使用查询。@YoryeNathan因此对硬盘进行了更多调用?@YoryeNathan:在这种情况下,Ilya是对的,因为Count需要使用给定的搜索模式枚举所有文件。因此,一般来说,如果您只需要文件名,最好使用Directory.EnumerateFiles。@IlyaIvanov它是性能vs内存。我通常喜欢表演,但这要视情况而定。这只是要指出,在某些情况下,EnumerateFiles方法更合适,即使它最终使用了查询。如果长度大于20,则正好26个字符有点不同。
        string[] files = Directory
                         .EnumerateFiles(@"c:\Users\x074\Downloads" , "*.jpg" , SearchOption.AllDirectories )
                         .Where( path => Path.GetFileName(path).Length > 20 )
                         .ToArray()
                         ;