【问题标题】:Is there a way to get the length of the returned value of enumerateFiles?有没有办法获取 enumerateFiles 的返回值的长度?
【发布时间】:2017-04-25 20:35:18
【问题描述】:

我正在尝试获取一个 uri 数组,但我在创建数组时不知道它的长度。数组长度应该是变量“文件”中项目数量的长度。 我知道我可以使用列表来执行此操作,但我想尝试将其简化为单个数组,为此我需要“文件”的长度

Uri[] imageArray = new Uri[*some amounts of items from 'files'*]
var files = Directory.EnumerateFiles("C:\\Users\\doggoz\\Documents\\VisualStudio2015\\Projects\\somethinngggggg\\", "*.*", SearchOption.TopDirectoryOnly)
                     .Where(s => s.EndsWith(".jpeg") || s.EndsWith(".jpg") || s.EndsWith(".png") || s.EndsWith(".gif") || s.EndsWith(".bmp"));

【问题讨论】:

  • 不是没有枚举两次,没有。

标签: c# arrays linq


【解决方案1】:

您可以使用ToArray 方法:

var files = Directory.EnumerateFiles("C:\\Users\\doggoz\\Documents\\VisualStudio2015\\Projects\\somethinngggggg\\", "*.*", SearchOption.TopDirectoryOnly)
                     .Where(s => s.EndsWith(".jpeg") 
                              || s.EndsWith(".jpg") 
                              || s.EndsWith(".png") 
                              || s.EndsWith(".gif") 
                              || s.EndsWith(".bmp")
                    ).ToArray();

var imageArray = new Uri[files.Length];

顺便说一句,我建议您将多个 OR 更改为以下内容,这会使您的代码更具可读性:

var extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase)  
{  ".jpeg", ".jpg", ".png", ".gif", ".bmp" };

var files = Directory.EnumerateFiles(@"C:\Users\doggoz\Documents\VisualStudio2015\Projects\somethinngggggg\", "*.*", SearchOption.TopDirectoryOnly)
                     .Where(s => extensions.Contains(Path.GetExtension(s)))
                     .ToArray();

【讨论】:

    【解决方案2】:

    您可以保留现有代码,只需按相反的顺序放置行。这样您就可以提前获得文件枚举,并且可以访问Count() 方法:

    var files = Directory.EnumerateFiles(
        @"C:\Users\doggoz\Documents\VisualStudio2015\Projects\somethinngggggg\", 
        "*.*", SearchOption.TopDirectoryOnly)
            .Where(s => 
                s.EndsWith(".jpeg") || 
                s.EndsWith(".jpg") || 
                s.EndsWith(".png") || 
                s.EndsWith(".gif") || 
                s.EndsWith(".bmp"));
    
    Uri[] imageArray = new Uri[files.Count()];
    

    或者,您可以将结果转换为内联的 Uri 数组:

    Uri[] imageArray = Directory.EnumerateFiles(
        @"C:\Users\doggoz\Documents\VisualStudio2015\Projects\somethinngggggg\", 
        "*.*", SearchOption.TopDirectoryOnly)
            .Where(s => 
                s.EndsWith(".jpeg") || 
                s.EndsWith(".jpg") || 
                s.EndsWith(".png") || 
                s.EndsWith(".gif") || 
                s.EndsWith(".bmp"))
            .Select(filePath => new Uri(filePath))
            .ToArray();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多